【问题标题】:Python Regex: Data scrape <li>data<ol><li>data</li></ol></li>Python 正则表达式:数据抓取 <li>data<ol><li>data</li></ol></li>
【发布时间】:2020-08-18 05:10:52
【问题描述】:

我有一个 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 这样的包。我想通过使用正则表达式来解决这个问题。

【问题讨论】:

标签: python html regex web-scraping


【解决方案1】:

如前所述,BeautifulSoup 是完成此任务的正确工具:

import bs4
file_name = "team.html"
mode = "r"    
with open(file_name, mode) as fp:
    team = fp.read()
soup = bs4.BeautifulSoup(team)
country = None
for i in soup.findAll('li'):
    if '\n' in i.text: 
         if country:
             print(country,'-', ', '.join(players))
         country = i.text.splitlines()[1].strip()
         players = []
    else:
         players.append(i.text)
print(country,'-', ','.join(players))    

【讨论】:

    【解决方案2】:

    在这种情况下使用正则表达式可能是错误的。 (我不是 100% sur)。 你应该使用Beautiful Soup

    甚至是其他 HTML 解析器

    【讨论】:

      【解决方案3】:

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

      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))
      

      【讨论】:

        猜你喜欢
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 2021-07-25
        相关资源
        最近更新 更多