使用BeautifulSoup和Selector时如何实现class属性的精确单值匹配?
最优解决方案
直接修改CSS选择器,用精确属性匹配替换原有的类名匹配即可,仅需要调整一行代码:
把原有代码中的:
divs = selector.css('.panel .panel-heading a::attr(href)').getall()
替换为:
divs = selector.css('div[class="panel"] .panel-heading a::attr(href)').getall()
原理解释
- 原生
.panel类选择器的规则是「只要元素class属性包含panel这个值就命中」,所以多类的<div class="panel grey">也会被匹配到 div[class="panel"]是属性精确匹配规则,只有当div的class属性完整值完全等于panel时才会命中,完全符合你只匹配单值class的需求
边缘场景兼容方案
如果你的HTML中存在class属性前后带空格的写法(比如<div class=" panel ">),上述精确匹配会失效,这时候可以改用XPath选择器做更灵活的判断:
divs = selector.xpath('//div[normalize-space(@class)="panel"]/div[contains(@class,"panel-heading")]/a/@href').getall()
normalize-space(@class)会自动去除属性值前后的空白、合并中间的多余空格,进一步提升匹配准确性。
内容的提问来源于stack exchange,提问作者Picarica
相关产品推荐
相关产品推荐

