所以,我给了一个HTML文件,其中包含一些国家名称和来自该国家的两名玩家。我必须阅读该html文件,并使用正则表达式以特定格式显示国家和玩家名称。
HTML代码如下:
<ul>
<li>
Australia
<ol>
<li> Steven smith </li>
<li> David Warner </li>
</ol>
</li>
<li>
Bangladesh
<ol>
<li> Mashrafe Mortaza </li>
<li> Tamim Iqbal </li>
</ol>
</li>
<li>
England
<ol>
<li> Eoin Morgan </li>
<li> Jos Buttler </li>
</ol>
</li>
</ul>
我必须以这种格式显示它:
Australia - Steven Smith, David Warner
Bangladesh - Mashrafe Mortaza, Tamim Iqbal
England - Eoin Morgan, Jos Buttler
我已经尝试了一些东西,但到目前为止还没有。这是我到目前为止能够提出的:
>> with open("test.html","r") as f:
text = f.read()
>> import re
>> pq = re.findall(r'^<li>\n(.+?)\n\t<ol>\n\t<li>(.+?)</li>\n\t<li>(.+?)
</li>$',text,re.M)
输出如下:
[('Australia', ' Steven smith ', ' David Warner '),
('Bangladesh', ' Mashrafe Mortaza ', ' Tamim Iqbal '),
('England', ' Eoin Morgan ', ' Jos Buttler ')]
这不是我想要的。国名似乎没问题。但是玩家名称包含标签。我是正规表达的新手,我不完全确定在这里做什么。任何帮助,将不胜感激。
答案 0 :(得分:2)
您可以使用解析器和正则表达式的组合:
from bs4 import BeautifulSoup
import re
rx = re.compile(r'''
^
(?P<country>\w+)\s*
(?P<player1>.+)[\n\r]
(?P<player2>.+)''', re.MULTILINE | re.VERBOSE)
soup = BeautifulSoup(your_string_here, 'lxml')
players = ["{} - {}, {}".format(m.group('country'), m.group('player1').strip(), m.group('player2').strip())
for item in soup.select('ul > li')
for m in rx.finditer(item.text)]
print(players)
哪个收益
['Australia - Steven smith, David Warner', 'Bangladesh - Mashrafe Mortaza, Tamim Iqbal', 'England - Eoin Morgan, Jos Buttler']