You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup获取包含指定子串的元素文本?

解决方案

问题原因分析

你用soup.find_all("div", string="Official name:")返回空列表,是因为string参数要求完全匹配元素文本,但目标元素的实际文本是带引号的完整行("Official name: Company Name"),并非仅子串"Official name:"。此外硬编码XPath依赖元素位置,一旦文档结构调整(比如新增/删除div)就会失效。


方法1:用BeautifulSoup的自定义匹配提取

直接通过子串匹配定位元素,不依赖结构位置:

from bs4 import BeautifulSoup

def get_organization(soup):
    # 查找包含"Official name:"的div元素(忽略标签类型也可换用soup.find(text=lambda t: "Official name:" in t))
    target_element = soup.find(lambda tag: tag.name == 'div' and 'Official name:' in tag.text)
    if target_element:
        # 提取冒号后的公司名,去除引号和多余空格
        org_name = target_element.text.split(": ")[1].strip('"')
        return org_name
    return None

方法2:定位统一信息容器后逐行提取

先找到包含所有信息的父容器(比如示例中的div.txtmark),再从中筛选目标行:

def get_organization(soup):
    # 定位到存放所有信息的容器
    info_container = soup.find('div', class_='txtmark')
    if info_container:
        # 将<br>标签转换为换行符,分割成单独行
        lines = info_container.get_text(separator='\n').split('\n')
        for line in lines:
            if 'Official name:' in line:
                return line.split(": ")[1].strip('"')
    return None

方法3:用lxml的模糊匹配XPath(兼容原有代码)

如果继续使用lxml,改用contains()函数实现文本模糊匹配,摆脱位置依赖:

from lxml import etree

def get_organization(dom):
    # 匹配所有包含"Official name:"文本的div元素
    target_elements = dom.xpath('//div[contains(text(), "Official name:")]')
    if target_elements:
        return target_elements[0].text.split(": ")[1].strip('"')
    return None

内容的提问来源于stack exchange,提问作者David Jimenez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:55:32