使用正则表达式从html文件中提取国家明智的玩家列表的更好方法

时间:2017-10-27 05:49:55

标签: python regex

问题陈述:

通过以下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>

预期产出:

澳大利亚 - 史蒂文史密斯,大卫华纳

孟加拉国 - Mashrafe Mortaza,Tamim Iqbal

英格兰 - Eoin Morgan,Jos Buttler

我的代码:

效果很好。我正在寻找更好的代码。请帮帮我。

import re

with open('playerlist.html', 'r') as f:
    text = f.read()

mytext = re.sub(r'[\n\t]', '', text)

pat = r'<li>(\w+?)<ol><li>(\w+\s?\w+)</li><li>(\w+\s?\w+)</li>'

cpat = re.compile(pat)

result = cpat.findall(mytext)


for a,b,c in result:
    print('{0}- {1}, {2}'.format(a,b,c))

2 个答案:

答案 0 :(得分:0)

使用正则表达式解析xml / html数据从来都不是一个好主意。
使用xml / html解析器。

xml.etree.ElementTree 模块的正确方法(其中一个解析器。您可以尝试其他解析器):

import xml.etree.ElementTree as ET

root = ET.parse('playerlist.html').getroot()
for li in root.findall('.//li[ol]'):
    print(li.text.strip(), '- {}, {}'.format(*(i.text.strip() for i in li.findall('ol/li'))))

输出:

Australia - Steven Smith, David Warner
Bangladesh - Mashrafe Mortaza, Tamim Iqbal
England - Eoin Morgan, Jos Buttler

答案 1 :(得分:0)

将换行符和制表符替换为“”之后,我的正则表达式模式如下所示。

r'<li>\s*(\w+?)\s*<ol>\s*<li>\s*(\w+\s?\w+)\s*</li>\s*<li>\s*(\w+\s?\w+)\s*</li>'