4

假设以下是 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>

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

我知道如果我对整个文档进行了漂亮的处理,我可以使用类似的东西findAll("table")给我所有的表格,但我不知道我怎么可能得到那个值。我也许可以做类似的事情findAll("a"),但是我将如何指定“名称”等于(在这种情况下为 1)?即使我能做到这一点,我也无法进入“1)文本编辑器”,因为“a”标签是空的......而且我也无法进入“ <b>Application Name: Notepad</b>”部分。

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

4

2 回答 2

1

看起来您可以轻松地传入attrs匹配的字典。这看起来像是包含name属性。

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

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

如果您还没有查看过它,文档提供了大量关于如何在 HTML 文档中查找元素的非常棒的示例。

于 2012-10-28T19:25:43.010 回答
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参数是唯一的,因为name它是一个特殊的参数findAll()。如果它是其他属性,您可以使用例如

>>> a = soup.findAll("a", href="whatever")
于 2012-10-28T19:34:36.777 回答