2017-07-01 190 views
1

假如我有一個HTML字符串是這樣的:如何使用Python中的BeautifulSoup提取標籤內的文本?

<html> 
    <div id="d1"> 
     Text 1 
    </div> 
    <div id="d2"> 
     Text 2 
     <a href="http://my.url/">a url</a> 
     Text 2 continue 
    </div> 
    <div id="d3"> 
     Text 3 
    </div> 
</html> 

我想提取的d2的內容,其他標籤包裹,跳過a url。換句話說,我想得到這樣的結果:

Text 2 
Text 2 continue 

有沒有辦法用BeautifulSoup做到這一點?

我嘗試這樣做,但它是不正確的:

soup = BeautifulSoup(html_doc, 'html.parser') 
s = soup.find(id='d2').text 
print(s) 

回答

3

嘗試用.find_all(text=True, recursive=False)

from bs4 import BeautifulSoup 
div_test=""" 
<html> 
    <div id="d1"> 
     Text 1 
    </div> 
    <div id="d2"> 
     Text 2 
     <a href="http://my.url/">a url</a> 
     Text 2 continue 
    </div> 
    <div id="d3"> 
     Text 3 
    </div> 
</html> 
""" 
soup = BeautifulSoup(div_test, 'lxml') 
s = soup.find(id='d2').find_all(text=True, recursive=False) 
print(s) 
print([e.strip() for e in s]) #remove space 

它會返回一個list只有text

​​
1

你可以得到只有NavigableString對象用一個簡單的列表理解。

tag = soup.find(id='d2') 
s = ''.join(e for e in tag if type(e) is bs4.element.NavigableString) 

或者您可以使用decompose方法刪除所有子節點,然後得到與text所有剩餘項目。

tag = soup.find(id='d2') 
for e in tag.find_all() : 
    e.decompose() 
s = tag.text 
相關問題