Python 根据标签周围的内容查找标签(使用beautifulsoup)

Python 根据标签周围的内容查找标签(使用beautifulsoup),python,beautifulsoup,Python,Beautifulsoup,我正在使用BeautifulSoup解析一些HTML。假设我在一个名为soup的BeautifulSoup中有以下HTML: <td class="1">test1</td> <td>test2</td> <td class="3"><a href="/">test3</a></td> <td><div class="test4"><a class="test4" hre

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

<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>
但是我如何才能只找到包含test4类的div的“td”标记呢?或者用test4围绕“a”标记

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

soup.findAll("a", {"class":"test4"})
但我需要将其与最初的“td”搜索结合起来,这样我就可以扔掉所有不围绕“a”或“div”标记的“td”标记


想法?谢谢

这仅在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>]
>>从BeautifulSoup导入BeautifulSoup
>>>汤=美汤(''测试1
…测试2
... 
... 
... 
... ''')
>>>[soup.findAll中标记的tag.parent(attrs={“class”:“test4”})
…如果['a','div']中的tag.name和tag.parent.name=='td']
[, ]

我会这样做:

>>> 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>]
>>tdList=[]
>>>对于汤中的td.findAll('td'):
...     对于td.findAll中的div('div',{'class':'test4'}):
...         tdList.append(div.parent)
... 
>>>tdList
[, ]
当然,您可以根据需要增加粒度,但对于提供的html,这就完成了任务。

当您说“环绕”时,是指“是的父母”还是“是的祖先?”
>>> 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>]