如何解析python beautifulsoup中的以下HTML?

时间:2012-10-28 19:15:07

标签: python html beautifulsoup

假设以下是HTML文档的子集...请注意,有多个表重复,但<a name="1">可能是“2”,“3”,“4”等,但文本不同对于每张桌子。

<table align="center" width="550">
<tr>
<td valign="top" width="300"><b>Product:</b></img></td>
<td>
<a name="1"></a>1) Text Editor
<p>An application for the editing of text files.</p>
<br>
<b>Application Name: Notepad</b>
<br>            
<b>Type: Writing</b>
<br><br></td>
</tr>
</table>

我希望能够找到一个等于特定“#”的“a”标签(在本例中为1) 并能够以某种方式获得文本:“1)文本编辑器”。

我知道如果我把整个文档美化了,我可以使用类似findAll("table")的东西给我所有的表格,但我不知道我怎么可能达到那个价值。我可以做findAll("a")之类的事情,但是如何指定“name”等于(在这种情况下为1)?即使我能做到这一点,我也无法进入“1)文本编辑器”,因为“a”标签是空的......我也无法达到像“<b>Application Name: Notepad</b>”这样的部分。

结合使用python / beautifulsoup的最佳解决方案是什么,或者是否有更好的方法可以根据事实获得表格的“1)文本编辑器”和“应用程序名称”和“类型”部分在它之前有一个<a name="1"></a>?示例语法很棒。

2 个答案:

答案 0 :(得分:1)

看起来您可以轻松传入attrs字典以进行匹配。这看起来包含name属性。

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#arg-attrs

soup.findAll(attrs={'name' : '1'})

如果您还没有查看过,那么文档提供了很多关于如何在HTML文档中查找元素的非常好的示例。

答案 1 :(得分:1)

您可以使用findAll ...

指定属性
>>> a = soup.findAll("a", attrs={"name": "1"})[0]

...然后获取下一个节点......

>>> a.next
u'1) Text Editor\n'

...以及下一个<b>元素......

>>> a.findNext("b")
<b>Application Name: Notepad</b>

......等等。

顺便说一下,attrs参数只是必要的,因为namefindAll()的特殊参数。如果它是其他属性,你可以使用例如。

>>> a = soup.findAll("a", href="whatever")