在以下情况中获取d2和d3文本的方法是什么:
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 def<sup>2</sup></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')
d1 = soup.find('div', class_ = 'b', text = 'abc def1').findNext('div').text
print(d1)
d2 = soup.find('div', class_ = 'b', text = 'abc def2').findNext('div').text
print(d2)
d3 = soup.find('div', class_ = 'b', text = 'abc def3').findNext('div').text
print(d3)
它仅适用于d1,但对于d2和d3,则存在错误...
这是因为您的文本匹配规则不适用于文本
我的解决方案似乎是一种解决方法,但无论如何,你可以试试这个。
你应该在使用unwrap
和extract
方法删除未使用的标签和注释之前
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 def<sup>2</sup></div>
<div class="c">456</div>
</div>
<div class="a">
<div class="b">abc <!-- -->def3</div>
<div class="c">789</div>
</div>
</html>'''
def get_new_soup():
soup = bs4.BeautifulSoup(htmldoc, 'html.parser')
divs_b = soup.find_all('div',{'class','b'})
for div in divs_b:
# Remove unwanted tag (like <sup> here)
if div.sup:
div.sup.unwrap()
# Remove comments
for element in div(text=lambda text: isinstance(text, bs4.Comment)):
element.extract()
soup_str = str(soup)
return(bs4.BeautifulSoup(soup_str,'html.parser'))
soup = get_new_soup()
d1 = soup.find('div', class_ = 'b', text = 'abc def1').findNext('div').text
print(d1)
d2 = soup.find('div', class_ = 'b', text = 'abc def2').findNext('div').text
print(d2)
d3 = soup.find('div', class_ = 'b', text = 'abc def3').findNext('div').text
print(d3)
OUTPUT:
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 def<sup>2</sup></div>
<div class="c">456</div>
</div>
<div class="a">
<div class="b">abc <!-- -->def3</div>
<div class="c">789</div>
</div>
</html>'''
def get_new_soup():
soup = bs4.BeautifulSoup(htmldoc, 'html.parser')
divs_b = soup.find_all('div',{'class','b'})
for div in divs_b:
# Remove comments
for element in div(text=lambda text: isinstance(text, bs4.Comment)):
element.extract()
soup_str = str(soup)
return(bs4.BeautifulSoup(soup_str,'html.parser'))
soup = get_new_soup()
search_text = ['abc def1', 'abc def<sup>2</sup>', 'abc def3']
divs = soup.find_all('div', class_ = 'b')
for div in divs:
content = ''.join(str(c) for c in div.contents)
if content in search_text:
print(div.findNext('div').text)
OUTPUT:
123
456
789
我可能会遗漏一些东西,但这样做:
d1 = soup.find_all('div', class_ = 'c')
for i in (d1):
print(i.text)
给出这个输出:
123
456
789
这是你在找什么?