Scrapy中如何用CSS选择器选取带方括号属性的HTML标签?
同itemprop属性的电话/传真元素提取方案
两种方案都可以实现区分提取,直接参考可用代码即可:
CSS选择器写法
Scrapy基于parsel实现的CSS选择器支持匹配任意自定义属性,仅需对属性名中的特殊符号做转义:
- 提取电话号码
# 匹配绑定revealtel显示逻辑的电话节点 phone_num = response.css('span[itemprop="telephone"][\\[class\\]="revealtel?\'\':\'invisible\'"]::text').get()
- 提取传真号码
# 匹配绑定revealmainfax显示逻辑的传真节点 fax_num = response.css('span[itemprop="telephone"][\\[class\\]="revealmainfax?\'\':\'invisible\'"]::text').get()
注意:CSS选择器语法中方括号是属性选择的特殊标记,属性名自带的
[和]必须加双反斜杠转义,属性值内的单引号也需要转义,否则会触发选择器语法错误。
XPath写法(更推荐,转义成本低)
XPath对非标准自定义属性的适配更灵活,不需要对方括号做多层转义,遇到属性名带特殊字符的场景,用name()函数匹配属性名即可,写法容错率更高:
- 提取电话号码
phone_num = response.xpath( '//span[@itemprop="telephone" and @*[name()="[class]"] = "revealtel?\'\':\'invisible\'"]/text()' ).get()
- 提取传真号码
fax_num = response.xpath( '//span[@itemprop="telephone" and @*[name()="[class]"] = "revealmainfax?\'\':\'invisible\'"]/text()' ).get()
写法说明:@*[name()="[class]"]用来匹配当前元素下,属性名恰好为[class]的属性,再判断属性值是否符合预期,避开了XPath语法中@后直接跟特殊字符的语法冲突。
如果运行后提取结果为空,先检查Scrapy拿到的原始响应里这两个span的文本是否正常:部分站点会默认给这类联系方式加隐藏类,需要触发点击、滑动等交互动作才会渲染真实号码,这类场景需要先处理前端渲染逻辑再做提取。
内容的提问来源于stack exchange,提问作者Artsiom
相关产品推荐
相关产品推荐

