【问题标题】:Python HTML RegexPython HTML 正则表达式
【发布时间】:2015-07-04 18:29:11
【问题描述】:

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

我有一个 txt 文件,其中包含如下所示的 html, 我正在尝试使用 python 2.6 正则表达式来收集所有玩家姓名和评分。

玩家名字第一次出现在第 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>

【问题讨论】:

  • 考虑使用 BeautifulSoup?
  • 是的,我使用 BS 来获取 html,但我不知道如何只选择文本文件的那些特定部分。
  • 你是如何使用 BeautifulSoup 获取 hml 的?
  • 抱歉用汤美化和find_all tr​​,class,a
  • 使用上述 html 的正确输出应该是:PlayerA 29.2 PlayerB 32.2

标签: python html regex


【解决方案1】:

我建议使用Beautiful Soup 来解析 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 在我的问题的代码部分。它只是保存在文本文件中的 html。
  • AttributeError: 'NoneType' 对象没有属性 'strip'
  • 添加了对 None 字符串的检查(你应该提到这是可能的)
  • 太棒了,我现在有了所有的名字,我只需要每个名字旁边的相应统计信息,即 playernamea 28.9 playernameb 32.4
  • 使用上述 html 的正确输出应该是:PlayerA 29.2 PlayerB 32.2
【解决方案2】:

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

在您的示例中,缺少 &lt;td&gt; 之间的结束 &lt;tr&gt; 标记?

编辑:使用 OP 示例作为源

无论如何,使用 lxml.html 和简单的 xpath 来获得您期望的结果:

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

【讨论】:

  • 问题是html看起来就像我上面的一样,它都在一个.txt文件中
  • @user3496483,因为使用lxml.html,解析器更能容忍损坏的html。因此,在您的用例中,仍然可以按预期解析和获取结果,只需随后 strip() 文本即可。
  • Traceback(最近一次调用最后):文件“C:\Python26\hotcoldparser.py”,第 28 行,在 lxml.html.parse(mike_file) 文件“C:\Python26\ Lib\site-packages\lxml\html_init_.py”,第 692 行,解析返回 etree.parse(filename_or_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._parseDocument (src/lxml/lxml.etree.c :79485) 文件“parser.pxi”,第 1557 行,在 lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:79768)
  • @user3496483,我对windows环境不熟悉,但也许你可以试试import lxml.html as html,然后使用html.parse(...)更改以下行
  • 唯一的问题是这给了我找到的第一个 int,而不是正确的位置。
猜你喜欢
  • 2012-05-20
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2010-09-12
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多