Python如何从Selenium抓取的HTML中同时提取label文本及对应id
实现方案
方法1:直接使用re.findall(无需额外函数)
re.findall本身支持多分组匹配,当正则表达式中存在多个捕获组时,会自动返回由各组匹配结果组成的元组列表,刚好可以满足同时提取id属性和标签文本的需求。
注意:你原正则的闭合标签写法
<?label>存在错误,label的标准闭合标签是</label>,需要先调整这部分逻辑。
示例代码如下:
import re # 正则同时捕获id属性值和标签文本,兼容无id属性的label标签 var1 = re.findall(r'<label\s*(?:.*?\sid="([^"]+)")?.*?>(.+?)<\/label>', html_code, re.S)
- 规则说明:
- 第一个捕获组
([^"]+)匹配id属性双引号包裹的内容 - 外层加
?适配没有id属性的label标签,无id时对应位置返回None re.S修饰符让.可以匹配换行符,避免标签跨行时匹配失败
- 第一个捕获组
- 返回结果格式示例:
[("username_label", "用户名"), ("password_label", "密码"), (None, "无id的标签文本")]
你可以直接遍历结果分别取值:
for label_id, label_text in var1: print(f"标签id:{label_id},标签文本:{label_text}")
方法2:更稳定的HTML解析方案(推荐)
正则匹配HTML很容易受属性顺序、引号类型(单引号/无引号)、标签嵌套等情况影响匹配失败,如果你对稳定性要求高,建议用BeautifulSoup解析:
from bs4 import BeautifulSoup soup = BeautifulSoup(html_code, "html.parser") result = [] for label_tag in soup.find_all("label"): label_id = label_tag.get("id") label_text = label_tag.get_text(strip=True) result.append( (label_id, label_text) )
该方案不需要处理正则的各种边界情况,适配性更强。
内容的提问来源于stack exchange,提问作者Tipo33
相关产品推荐
相关产品推荐

