我的html如下:
<html>
<div class="maindiv">
text data here
<br>
continued text data
<br>
<div class="somename">
text & data I want to omit
</div>
</div>
</html>
我试图只获取maindiv
元素中找到的文本,而不会在somename
元素中找到文本数据。在大多数情况下,根据我的经验,大多数文本数据都包含在某些子元素中。我遇到了这种特殊情况,但数据似乎有点 will-nilly ,并且有点难以过滤。
我的方法如下:
textdata= soup.find('div', class_='maindiv').get_text()
这将获取maindiv
元素中找到的所有文本数据,以及somename
div元素中的文本数据。
我想使用的逻辑更多的是:
textdata = soup.find('div', class_='maindiv').get_text(recursive=False)
,它会省略somename
元素中找到的任何文本数据。
我知道recursive=False
参数在使用BeautifulSoup搜索DOM结构时仅用于查找父级elemenets,但不能与.get_text()
方法一起使用。
我已经意识到找到所有文本的方法,然后从somename
元素中找到的字符串数据中减去maindiv
元素中找到的字符串数据,但我正在寻找一些东西更有效率。
答案 0 :(得分:3)
离你的减法方法不远,但一种方法(至少在Python 3中)是丢弃所有子div。
s = soup.find('div', class_='maindiv')
for child in s.find_all("div"):
child.decompose()
print(s.get_text())
会打印出类似的内容:
text data here
continued text data
这可能比减去字符串更有效率和灵活性,但它仍然需要首先通过孩子。
答案 1 :(得分:0)
from bs4 import BeautifulSoup
html ='''
<html>
<div class="maindiv">
text data here
<br>
continued text data
<br>
<div class="somename">
text & data I want to omit
</div>
</div>
</html>'''
soup = BeautifulSoup(html, 'lxml')
soup.find('div', class_="maindiv").next_element
出:
'\n text data here \n '