根据它所包围的内容找到一个标签(使用beautifulsoup)
问题描述:
我使用BeautifulSoup来解析一些HTML。比方说,我有一个BeautifulSoup叫汤下面的HTML:根据它所包围的内容找到一个标签(使用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>
我可以得到所有“TD”标签的物品有:
soup.findAll("td")
但我怎么能找到只有“TD”标记,环绕有test4级的div吗?或者用test4包围'a'标签?
我知道我能找到带有属性的标签,如:
soup.findAll("a", {"class":"test4"})
但我需要这与最初的“TD”的搜索结合起来,让我扔掉所有的“TD”没有标签环绕'a'或'div'标签。
想法?谢谢!
答
这只有当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>]
答
这是我会怎么做:
>>> 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,可以完成工作。
当你说“环绕声”时,你的意思是“是......的父母”还是“是......的祖先?” – 2011-06-08 04:57:48
“是” – mix 2011-06-08 18:04:00