根据它周围的东西找到一个标签(使用beautifulsoup)

时间:2011-06-08 04:26:51

标签: python beautifulsoup

我正在使用BeautifulSoup来解析一些HTML。假设我在BeautifulSoup中有以下HTML,名为soup:

<td class="1">test1</td>
<td>test2</td>
<td class="3"><a href="/">test3</a></td>
<td><div class="test4"><a class="test4" href="/">test4</a></div></td>
<td><div class="test4"><a class="test4" href="/">test4</a></div></td>

我可以通过以下方式获取所有'td'标记的项目:

soup.findAll("td")

但是我怎样才能找到包含test4类的div的'td'标签?或者用test4包围'a'标签?

我知道我可以找到带有属性的标签,例如:

soup.findAll("a", {"class":"test4"})

但是我需要将它与最初的'td'搜索结合起来,这样我就会抛弃所有不包含'a'或'div'标签的'td'标签。

想法?谢谢!

2 个答案:

答案 0 :(得分:1)

这仅适用于test4元素的直接父元素是td,但它应该让您知道如何进行更复杂的查询:

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''<td class="1">test1</td>
... <td>test2</td>
... <td class="3"><a href="/">test3</a></td>
... <td><div class="test4"><a class="test4" href="/">test4</a></div></td>
... <td><div class="test4"><a class="test4" href="/">test4</a></div></td>
... ''')
>>> [tag.parent for tag in soup.findAll(attrs = {"class": "test4"})
...  if tag.name in ['a', 'div'] and tag.parent.name == 'td']
[<td><div class="test4"><a class="test4" href="/">test4</a></div></td>, <td><div class="test4"><a class="test4" href="/">test4</a></div></td>]

答案 1 :(得分:1)

我就是这样做的:

>>> tdList = []
>>> for td in soup.findAll('td'):
...     for div in td.findAll('div',{'class':'test4'}):
...         tdList.append(div.parent)
... 
>>> tdList
[<td><div class="test4"><a class="test4" href="/">test4</a></div></td>, <td><div class="test4"><a class="test4" href="/">test4</a></div></td>]

当然,您可以根据需要增加粒度,但是对于提供的html,这可以完成工作。