在BeautifulSoup中,在获取父元素数据时忽略子元素

时间:2016-11-17 16:35:34

标签: python html 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>

我试图只获取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元素中找到的字符串数据,但我正在寻找一些东西更有效率。

2 个答案:

答案 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        '