Python HTML正则表达式

Python HTML正则表达式,python,html,regex,Python,Html,Regex,使用以下txt文件的正确输出应为:PlayerA 29.2 PlayerB 32.2 我有一个用html填充的txt文件,如下所示, 我试图使用Python2.6正则表达式来收集所有playernames和评级 玩家名称第一次出现在第4行,评级出现在第16行。(29.2) 然后下一个玩家的名字出现在第22行,评级在第35行。 等等 fileout = open('C:\Python26\hotcold.txt') read_file = fileout.readlines() source =

使用以下txt文件的正确输出应为:PlayerA 29.2 PlayerB 32.2

我有一个用html填充的txt文件,如下所示, 我试图使用Python2.6正则表达式来收集所有playernames和评级

玩家名称第一次出现在第4行,评级出现在第16行。(29.2)

然后下一个玩家的名字出现在第22行,评级在第35行。 等等

fileout = open('C:\Python26\hotcold.txt')
read_file = fileout.readlines()
source = str(read_file)

expression = re.findall(r"(LS=113>.+?", source)
print expression
我试着用一个表达式来找到所有的名字和收视率,但它不起作用

<tr class="stats">
<td class="stats" colspan="1" valign="top">
<a href="index.php?c=playerview&amp;P=245&amp;LS=113">
PlayerA
</a>
</td>
<td class="stats" colspan="1" valign="top">
<b>
 4
</b>
,
<b>
 8
 </b>
</td>
<td class="stats" colspan="1" valign="top">
29.2
</td>

<tr class="stats">
<td class="stats" colspan="1" valign="top">
<a href="index.php?c=playerview&amp;P=245&amp;LS=113">
PlayerB
</a>
</td>
<td class="stats" colspan="1" valign="top">
<b>
 4
</b>
,
<b>
 8
 </b>
</td>
<td class="stats" colspan="1" valign="top">
32.2
</td>

4.
,
8.
29.2
4.
,
8.
32.2
我建议使用解析HTML并获取所需的值

使用以下代码:

from bs4 import BeautifulSoup

with open('sample.html', 'r') as html_doc:

    soup = BeautifulSoup(html_doc, 'html.parser')

    for row in soup.find_all('tr', 'stats'):        
        row_tds = row.find_all_next('td')
        print('{0} {1}'.format(
            row_tds[0].find('a').string.strip() if row_tds[0].find('a').string else 'None', 
            row_tds[2].string.strip() if row_tds[2].string else 'None')
        )
输出:

$ python testparse.py
PlayerA 29.2
PlayerB 32.2

有效。

或者,我建议使用适当的html解析器,而不是依赖正则表达式——尽管BeautifulSoup实际上是一个非常好且易于使用的库

在您的示例中,是否缺少
之间的结束
标记

编辑:使用OP样本作为源 总之,使用带有简单xpath的
lxml.html
,希望得到您期望的结果:

In [1]: import lxml.html

# sample.html is the same as in OP sample
In [2]: tree = lxml.html.parse("sample.html")

In [3]: root = tree.getroot()

In [4]: players = root.xpath('.//td[@class="stats"]/a/text()')

In [5]: stats = root.xpath('//td[@class="stats" and normalize-space(text())]/text()')

In [6]: print players, stats
['\nPlayerA\n', '\nPlayerB\n'] ['\n29.2\n', '\n32.2\n']

In [7]: for player, stat in zip(players, stats):
   ...:     print player.strip(), stat.strip()
   ...:
PlayerA 29.2
PlayerB 32.2

考虑使用漂亮的汤吗?是的,我用BS来获取HTML,但是我不知道如何挑选文本文件的特定部分。你是如何用漂亮的汤来获得HML?抱歉的使用汤来美化和发现所有的TR,类,使用上述html的正确输出应该是:PlayerA 29.2 PlayerB 32.2我使用的html在我问题的代码部分。这是唯一保存在文本文件中的html。AttributeError:“NoneType”对象没有属性“strip”添加了一个对None字符串的检查(您应该提到这是可能的),这太棒了,我现在有了所有的名字,我只需要在每个名字旁边有相应的统计信息ie playernamea 28.9 playernameb 32.4正确的输出使用上面的html应该是:PlayerA 29.2 PlayerB 32.2问题是html看起来就像我上面的一样,都在一个.txt中file@user3496483,使用
lxml.html
时,解析器更能容忍破坏的html。因此,在您的用例中,仍然可以按预期解析和获取结果,只需要
strip()
之后的文本。回溯(最近一次调用):文件“C:\Python26\hotcoldparser.py”,第28行,在lxml.html.parse(mike_文件)文件“C:\Python26\Lib\site packages\lxml\html init\uu.py”,第692行,在解析中,返回etree.parse(文件名为_或_url,parser,base_url=base_url,**kw)文件“lxml.etree.pyx”,第2942行,在lxml.etree.parse(src/lxml/lxml.etree.c:54187)文件“parser.pxi”,第1528行,在lxml.etree中。解析文档(src/lxml/lxml/lxml.etree.c:79485)文件“parser.pxi”,第1557行,在lxml.etree中(src/lxml/lxml.etree.c:79768)@user3496483,我不熟悉windows环境,但也许您可以尝试
将lxml.html导入为html
,然后使用
html.parse(…)
更改以下行。唯一的问题是,这会给我找到的第一个int,而不是正确的位置。