2011-06-08 52 views
0

我使用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'标签。

想法?谢谢!

+0

当你说“环绕声”时,你的意思是“是......的父母”还是“是......的祖先?” – 2011-06-08 04:57:48

+0

“是” – mix 2011-06-08 18:04:00

回答

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

这是我会怎么做:

>>> 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,可以完成工作。

相关问题