2017-07-01 136 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 
相关问题