2013-04-02 31 views
2

我玩BeautifulSoup 4,我有這樣的HTML代碼:BeautufulSoup 4,FindNext中()函數

</tr> 
      <tr> 
<td id="freistoesse">Giraffe</td> 
<td>14</td> 
<td>7</td> 
</tr> 

我想使這裏匹配<td>標籤之間的兩個值14和7

我試過這個:

giraffe = soup.find(text='Giraffe').findNext('td').text 

但這隻匹配14。我如何使用這個函數來匹配兩個值?

回答

5

使用find_all,而不是findNext

import bs4 as bs 
content = '''\ 
<tr> 
<td id="freistoesse">Giraffe</td> 
<td>14</td> 
<td>7</td> 
</tr>''' 
soup = bs.BeautifulSoup(content) 

for td in soup.find('td', text='Giraffe').parent.find_all('td'): 
    print(td.text) 

產生

Giraffe 
14 
7 

或者,你可以使用find_next_siblings(又稱fetchNextSiblings):

for td in soup.find(text='Giraffe').parent.find_next_siblings(): 
    print(td.text) 

產量

14 
7 

說明:

注意soup.find(text='Giraffe')回報NavigableString。

In [30]: soup.find(text='Giraffe') 
Out[30]: u'Giraffe' 

要獲得相關td標籤,使用

In [31]: soup.find('td', text='Giraffe') 
Out[31]: <td id="freistoesse">Giraffe</td> 

In [32]: soup.find(text='Giraffe').parent 
Out[32]: <td id="freistoesse">Giraffe</td> 

一旦你的td標籤,你可以使用find_next_siblings

In [35]: soup.find(text='Giraffe').parent.find_next_siblings() 
Out[35]: [<td>14</td>, <td>7</td>] 

PS。 BeautifulSoup添加了使用下劃線而不是CamelCase的方法名稱。他們做同樣的事情,但符合PEP8風格指南的建議。因此,比fetchNextSiblings更喜歡find_next_siblings

+0

謝謝,不知道爲什麼#1方法引發了一個錯誤:'AttributeError:'NavigableString'對象沒有屬性'find_all''的想法? – nutship

+1

'soup.find(text ='Giraffe')'返回一個'NavigableString'。使用'soup.find('td',text ='Giraffe')'代替'td'標籤。從那裏,調用'fetchNextSibling()'。 – unutbu

+0

非常感謝您的幫助! – nutship