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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:12:16