通过文字beautifulsoup从第二个div提取文字

时间:2019-12-24 13:02:15

标签: python html beautifulsoup

A具有以下html代码。需要基于“ text3”值提取text4

    <div class="main">
<ul>
<li>
<div class="1"> text1 </div>
<div class="2"> text2 </div>
</li>
<li>
<div class="1"> text3</div>
<div class="2"> text4</div>
</li>
</ul></div>

我使用了此代码,但无法正常工作。我是否缺少某些东西,或者有更简单的解决方案?

a.find_next_sibling('div')[0]
for a in soup.find_all('div', text='text3')

3 个答案:

答案 0 :(得分:1)

使用CSS选择器识别标签并使用find_next('div')

html='''   <div class="main">
<ul>
<li>
<div class="1"> text1 </div>
<div class="2"> text2 </div>
</li>
<li>
<div class="1"> text3</div>
<div class="2"> text4</div>
</li>
</ul></div>'''

soup=BeautifulSoup(html,'html.parser')
print(soup.select_one('.main div:contains(text3)').find_next('div').text.strip())

或者您可以使用正则表达式re。

from bs4 import BeautifulSoup
import re
html='''   <div class="main">
<ul>
<li>
<div class="1"> text1 </div>
<div class="2"> text2 </div>
</li>
<li>
<div class="1"> text3</div>
<div class="2"> text4</div>
</li>
</ul></div>'''

soup=BeautifulSoup(html,'html.parser')
print(soup.find('div', class_='main').find('div',text=re.compile("text3")).find_next('div').text.strip())

答案 1 :(得分:1)

如果您使用text='text3',则必须完全匹配,在您的示例中,该空格为text3。因此,您需要找到text3作为子字符串或包含在元素中,一旦完成,就可以获取下一个<div>元素

html = '''    <div class="main">
<ul>
<li>
<div class="1"> text1 </div>
<div class="2"> text2 </div>
</li>
<li>
<div class="1"> text3</div>
<div class="2"> text4</div>
</li>
</ul></div>'''


from bs4 import BeautifulSoup
import re

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

for a in soup.find_all('div', text=re.compile(r'text3')):
    print (a.find_next('div').text.strip())

答案 2 :(得分:0)

另一种解决方案

from simplified_scrapy.simplified_doc import SimplifiedDoc 
html = '''   <div class="main">
<ul>
<li>
<div class="1"> text1 </div>
<div class="2"> text2 </div>
</li>
<li>
<div class="1"> text3</div>
<div class="2"> text4</div>
</li>
</ul></div>'''
doc = SimplifiedDoc(html)
div = doc.getElementByText('text3',tag='div').getNext('div')
print (div) # {'class': '2', 'tag': 'div', 'html': 'text4'}
print (div.text) # text4