如何用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
相关产品推荐
相关产品推荐

