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

