【问题标题】:Scrape table element by row name using beautifulsoup使用beautifulsoup按行名刮取表格元素
【发布时间】:2026-01-29 16:00:01
【问题描述】:

这是我要抓取的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>

我想要的是在Text3 旁边获得Result3。在 selenium 中,我会这样做:

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的新手

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    您可以在 bs4 4.7.1+ dt:contains("Text3") + dd 中使用 CSS 选择器。这将选择&lt;dd&gt;,它紧跟在&lt;dt&gt; 之后,包含文本"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>
    

    【讨论】: