我知道问题标题并不令人惊讶,但我想不出更好的方式来表达它。我需要搜索一些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)。如果问题含糊不清,我会提前道歉。
答案 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(半结构化,他们称之为)网页。