首页 > 解决方案 > Python 正则表达式:数据抓取

  • 数据
    1. 数据
  • 问题描述

    我有一个 HTML 文件,我用 Python 阅读,我想在打印时自定义它。

    首先我要打印国家名称,然后是他们所属国家的玩家姓名。

    我的 HTML 文件如下所示:

    <ul>
    <li>
        Australia
        <ol>
            <li>Steve Smith</li>
            <li>David Warner</li>
            <li>Aaron Finch</li>
        </ol>
    </li>
    
    <li>
        Bangladesh
        <ol>
            <li>Shakib Al Hasan</li>
            <li>Tamim Iqbal</li>
            <li>Mushfiqur Rahim</li>
        </ol>
    </li>
    
    
    <li>
        England
        <ol>
            <li>Ben Stokes</li>
            <li>Joe Root</li>
            <li>Eoin Morgan</li>
        </ol>
    </li>
    

    现在我想从我的 HTML 文件中抓取这些数据:

    Australia - Steve Smith, David Warner, Aaron Finch
    Bangladesh - Shakib Al Hasan, Tamim Iqbal, Mushfiqur Rahim
    England - Ben Stokes, Joe Root, Eoin Morgan
    

    但我只能用球员的名字来刮。这是我的代码:

    import re
    
    file_name = "team.html"
    mode = "r"    
    
    with open(file_name, mode) as fp:
        team = fp.read()
    
    pat =  re.compile(r'<li>(.*?)</li>')
    result = pat.findall(team)
    res = ", ".join([str(player) for player in result])
    print(res)
    

    另外,我不使用任何像 bs4 这样的包。我想通过使用正则表达式来解决这个问题。

    标签: pythonhtmlregexweb-scraping

    解决方案


    这里是使用正则表达式的解决方案。

    import re
    
    file_name = "team.html"
    mode = "r"    
    
    with open(file_name, mode) as fp:
        team = fp.read()
    
    regex =  re.compile(r'<li>\s+(?P<country>[A-z ]+)|<li>(?P<name>[A-z ]+)</li>')
    
    country_team_rel = {}
    country = None
    for result in regex.findall(team):
        if result[0]:
            country = result[0]
            country_team_rel[country] = []
        else:
            country_team_rel[country].append(result[1])
    
    # Or If you like to print
    buffer = []
    for result in regex.findall(team):
        if result[0]:
            if buffer:
                print(", ".join(buffer))
                buffer = []
            print(result[0] + " - ", end='')
        else:
            buffer.append(result[1])
    print(", ".join(buffer))
    

    推荐阅读