2016-01-27 70 views
1

鑑於以下BeautifulSoup尋找下一個特定標籤的標籤發現

<tr class="row-class"> 
    <td>Age</td> 
    <td>16</td> 
</tr> 
<tr class="row-class"> 
    <td>Height</td> 
    <td>5.6</td> 
</tr> 
<tr class="row-class"> 
    <td>Weight</td> 
    <td>103.4</td> 
</tr> 

我試圖使用bs4lxml的相應行返回16以下(從更大的文件簡化)。這個問題似乎是有兩個td標籤之間的Navigable String,使

page.find_all("tr", {"class":"row-class"}) 

產生具有

result[0] = {Tag} <tr class="row-class"> <td>Age</td> <td>16</td> </tr> 
result[1] = {Tag} <tr class="row-class"> <td>Height</td> <td>5.6</td> </tr> 
result[2] = {Tag} <tr class="row-class"> <td>Weight</td> <td>103.4</td> </tr> 

,這是偉大的結果集,但我不能得到字符串第二個td。這些行的每個的內容是與所述td是一個tag' '是一個Navigable String類似於

[' ', <td>Age</td>, ' ', <td>16</td>, ' '] 

。這種差異阻止我使用next_elementnext_sibling方便的方法,用類似訪問正確的文本:

如果我使用:

find("td", text=re.compile(r'Age')).get_text() 

我得到Age。但是,如果我嘗試通過

find("td", text=re.compile(r'Age')).next_element() 

訪問下一個元素,我得到

「NavigableString」對象不是可調用

由於中result包裝NavigableStrings,與向後移動previous_element也有同樣的問題。

如何從找到的Tag移動到下一個Tag,跳過next_element?有沒有辦法從result中刪除這些' '

我應該指出的是,我已經嘗試過以務實的東西,如:

for r in (sp.find_all("tr", {"class":"row-class"})): 
     age = r.find("td", text=re.compile(r"\d\d")).get_text() 

它的工作...直到我解析與Age前一個匹配\d\d另一種秩序的文檔。

我知道,另外,我可以

find("td", text=re.compile(r'Age')).next_sibling.next_sibling 

但這是硬烘的結構。

所以我需要具體的搜索,發現有目標td字符串,然後在下一個td找到該值。我知道我可以建立一些測試每一行的邏輯,但似乎我錯過了一些明顯而優雅的東西......

回答

2

如果您獲取元素列表,則可以使用[index]從列表中獲取元素。

data = """<tr class="row-class"> 
    <td>Age</td> 
    <td>16</td> 
</tr> 
<tr class="row-class"> 
    <td>Height</td> 
    <td>5.6</td> 
</tr> 
<tr class="row-class"> 
    <td>Weight</td> 
    <td>103.4</td> 
</tr>""" 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(data) 

trs = soup.find_all("tr", {"class":"row-class"}) 

for tr in trs: 
    tds = tr.find_all("td") # you get list 

    print('text:', tds[0].get_text()) # get element [0] from list 
    print('value:', tds[1].get_text()) # get element [1] from list 

結果

text: Age 
value: 16 
text: Height 
value: 5.6 
text: Weight 
value: 103.4 
+0

感謝。我知道我可以做到這一點(以前做過很多次)。如果你看看我的帖子中的'for'循環,你會基本看到你所要求的。這就是我寫'我知道我可以建立一些測試每一行的邏輯'的意思,但是在這裏我正在尋找一種支持的方法,或者在bs4中的便利方法中讓我跳到下一個'標籤'兄弟姐妹或其他優雅的東西! –