使用BeautifulSoup在一个标签内获取带引号的文本

时间:2019-03-15 06:01:43

标签: beautifulsoup

我正在尝试使用BeautifulSoup解析网页。

情况1:

<div class="a">
    <div class="b">abc def</div>
    <div class="c">123 456</div>
</div>

情况2:

<div class="a">
    <div class="b">
        "abc "
        "def"
    </div>
    <div class="c">123 456</div>
</div>

我想使用以下代码从C类获取文本:

c = soup.find('div', class = 'b', text = 'abc def').next_sibling.text

在情况1中,效果很好。但是在案例2中,它不起作用。对于案例2,我也尝试过:

c = soup.find('div', class = 'b', text = '"abc ""def"').next_sibling.text

在两种情况下

soup.find('div', class = 'b').text 

赋予我相同的价值:

abc def

使用案例2的正确方法是什么?

[编辑#1]

我需要这样做,因为有多个div具有相同的类:

<div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div>

[编辑#2]

我试图将response.text保存到文件中,然后看到:

    <div class="b">abc <!-- -->def3</div>

但是在Chrome中,它看起来像:

    <div class="b">
        "abc "
        "def3"
    </div>

此外,如果标记内的文本像这样,我将无法通过重新编译获得文本:

    <div class="b">abc m<sup>2</sup></div>

1 个答案:

答案 0 :(得分:1)

您可以找到带有标签名称的下一个元素,然后打印该值。 您可以使用 <meta name="viewport" initial-scale=1.0 content="width=100%"> 模块搜索文本。 这里有两个例子。

示例1:

re

输出:

import bs4 htmldoc='''<html><div class="a"> <div class="b"> "abc " "def" </div> <div class="c">123 456</div> </div></html>''' soup = bs4.BeautifulSoup(htmldoc, 'html.parser') c = soup.find('div', class_='b').findNext('div').contents[0] print(c)

示例2:

123 456

输出:

import bs4
import re

htmldoc='''<html><div class="a">
    <div class="b">
        "abc "
        "def"
    </div>
    <div class="c">123 456</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')

d = soup.find('div', text=re.compile('def')).findNext('div').contents[0]
print(d)

示例3:

123 456

输出:

import bs4

htmldoc='''<html><div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')

c = soup.find_all('div', class_='b')
for d in c:
   text=d.findNext('div').contents[0]
   print(text)

示例4:

123
456
789

输出:

import bs4

htmldoc='''<html><div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')
d=soup.find(lambda tag:tag.name=="div" and "abc " in tag.text and  "def3" in tag.text).findNext('div').findNext('div').contents[0]

print(d)

示例5:

789

希望这会有所帮助。