这是我要剪贴的html:
<dl class="some class">
<dt> <strong>Text1</strong></dt>
<dd> Result1</dd>
<dt> <strong>Text2</strong></dt>
<dd> Result2</dd>
<dt> <strong>Text3</strong></dt>
<dd> Result3</dd>
<dt> <strong>Text4</strong></dt>
<dd> Result4</dd>
. . .
</dl>
我想要得到的是Result3
旁边的Text3
。在硒中,我可以通过以下方式实现:
parent=driver.find_element_by_css_selector("dl.BuyingOptions-labeledValues")
elem=parent.find_element_by_xpath("//dt[contains(.,'Text3')]/following::dd[1]")
我现在想对同一件事使用beautifulsoup。我首先尝试过:
parent=soup.find("dl","BuyingOptions-labeledValues")
可以正常工作,并且print(parent.text)
获取所有表文本。然后我尝试了:
elem = parent.find("dt",string='Country Of Origin')
这不起作用。请有人帮忙。我是Beautifulsoup的新手
答案 0 :(得分:0)
您可以将CSS Selector与bs4 4.7.1+ dt:contains("Text3") + dd
一起使用。这将选择<dd>
,该文本紧随<dt>
之后,其中包含文本"Text3"
:
data = '''
<dl class="some class">
<dt> <strong>Text1</strong></dt>
<dd> Result1</dd>
<dt> <strong>Text2</strong></dt>
<dd> Result2</dd>
<dt> <strong>Text3</strong></dt>
<dd> Result3</dd>
<dt> <strong>Text4</strong></dt>
<dd> Result4</dd>
</dl>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
print( soup.select_one('dt:contains("Text3") + dd').get_text(strip=True) )
打印:
Result3
进一步阅读:
另一种方法(使用bs4过滤):
print( soup.find(lambda t: t.name=='dt' and t.text.strip()=='Text3').find_next_sibling() )
打印:
<dd> Result3</dd>