从HTML解析特定信息的最简单方法

时间:2012-03-16 04:08:44

标签: python html regex

我知道问题标题并不令人惊讶,但我想不出更好的方式来表达它。我需要搜索一些HTMl:

<tr bgcolor="#e2d8d4">
<td>1</td>
<td>12:00AM</td>
<td>Show Name<a name="ID#"></a></td>
<td>Winter 12</td>
<td>Channel</td>
<td>Production Company</td>
<td nowrap>1d 11h 9m (air time)</td>
<td align="center">11</td>
<td>
<a href="link">AniDB</a></td>
<td><a href="link">Home</a></td>
</tr>

该页面是几十个这些html块。我需要能够,只用Show Name,选择给定节目的播出时间,以及bgcolor。 (完整页面:http://www.mahou.org/Showtime/Planner/)。我假设最好的赌注是regexp,但我对这个假设没有信心。我宁愿不使用第三方模块(BeautifulSoup)。如果问题含糊不清,我会提前道歉。

2 个答案:

答案 0 :(得分:1)

感谢您的研究 - 您了解BeautifulSoup是件好事。这将真正成为解决问题的最佳方式。

除此之外......这里是一个通用策略,你可以选择使用正则表达式(如果你的理智是有问题的)或使用BeautifulSoup(如果你是理智的话)。

  • 看起来您想要的数据总是在一个表格中,如:

    <table summary="Showtime series for Sunday in a Planner format." border="0" bgcolor="#bfa89b" cellpadding="0" cellspacing="0" width="100%">

    您可以通过查找表格的summary="Showtime series for (Monday|Tuesday|....|Sunday)"属性来隔离此内容,该属性在页面中是唯一的。

  • 您已经隔离了该表,表中的行格式已明确定义。我会一次得到<tr>,并假设第二个<td>将始终包含播出时间,第三个<td>将始终包含该节目的名称。

正则表达式可以很好地从HTML中提取非常简单的内容,例如“所有src标记的img路径”,但是一旦开始讨论嵌套标记,例如“find the second {{ 1}}具有属性<td>的表的每个<tr>标记的标记,它变得更加困难。这是因为正则表达式不适用于嵌套结构。

请参阅canonical answer to 'regexps and HTML' questions和Tom Christiansen对what it takes to use regexps on arbitrary HTML的解释。 tchrist证明你可以使用正则表达式解析你想要的任何HTML - 如果你有足够的决心 - 但是像summary="..."这样的正确解析库更快,更容易,并且会给出更好的结果

答案 1 :(得分:1)

这应该是评论,但结果太长了。

BeautifulSoup的文档非常好,因为它包含了相当多的examples,只要知道有两个版本,并不是每个版本都可以很好地与每个版本的Python一起使用,尽管可能你不会有那里的问题(见:"Beautiful Soup 4 works on both Python 2 (2.7+) and Python 3.“)。

此外,像BeautifulSoup或lxml这样的HTML解析器在处理HTML之前清理HTML(使其有效,因此您可以正确遍历其树),因此它们可能会移动某些被视为无效的元素。通常,您可以禁用该功能,但不确定您是否会获得所需的结果。

还有其他方法可以解决您所要求的任务。然而,他们更多地参与实施,所以也许在你描述的条件下不可取。但只是为了让您知道,整个信息提取领域(IE)处理这类问题。 Here(PDF)是一个或多或少的最新调查,主要侧重于IE提取HTML(半结构化,他们称之为)网页。