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

BeautifulSoup中findAll()提取img多id问题:如何获取所有顺序id?

解决HTML重复id属性的提取问题

这情况我太熟了!首先得敲个重点:HTML规范明确规定单个元素不能有重复的属性,所以你用的html.parser和lxml这类HTML解析器,都会自动“修复”这个不符合规范的标签——只不过两者的修复逻辑不一样:html.parser会保留最后一个重复的id,而lxml会保留第一个,这就是为啥你拿到的结果各不一样。

如果非要按输入顺序获取所有重复的id,得绕过HTML解析器的属性合并逻辑,给你两个靠谱的方案:

方案1:用正则表达式直接提取

直接对原始HTML字符串做匹配,跳过解析器的处理,精准抓取所有id属性值:

import re

# 你的原始HTML内容
webpage = '<img id="webfast-uhyubv" alt="" data-type="image" id="comp-jefxldtzbalatamediacontentimage" src="http://webfast.co/images/webfast-logo.png" />'

# 匹配所有id="xxx"格式的内容
id_pattern = re.compile(r'id="([^"]+)"')
all_ids = id_pattern.findall(webpage)

print(all_ids)
# 输出结果:['webfast-uhyubv', 'comp-jefxldtzbalatamediacontentimage']

方案2:用XML解析器处理

XML解析器对重复属性的容忍度更高(虽然XML规范也不允许,但解析时会保留所有属性),可以用lxml.etree的XML模式来解析:

from lxml import etree

webpage = '<img id="webfast-uhyubv" alt="" data-type="image" id="comp-jefxldtzbalatamediacontentimage" src="http://webfast.co/images/webfast-logo.png" />'

# 用XML模式解析,而不是HTML模式
root = etree.fromstring(webpage)
# 提取所有id属性
all_ids = root.xpath('@id')

print(all_ids)
# 输出结果:['webfast-uhyubv', 'comp-jefxldtzbalatamediacontentimage']

最后补一句:虽然这两个方法能解决当前问题,但本质上带有重复属性的HTML是不合法的,长期来看最好是从生成HTML的源头避免这种情况哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:22