我正在尝试使用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>
答案 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
希望这会有所帮助。