使用beautifulsoup按行名抓取表格元素

时间:2019-08-05 05:30:53

标签: python web-scraping beautifulsoup

这是我要剪贴的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的新手

1 个答案:

答案 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

进一步阅读:

CSS Selectors Reference


另一种方法(使用bs4过滤):

print( soup.find(lambda t: t.name=='dt' and t.text.strip()=='Text3').find_next_sibling() )

打印:

<dd> Result3</dd>