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

相關問題