Scrapy XPath选择多类div时出现语法错误求助
问题分析与解决方案
嘿,我一眼就识别出你代码里的问题啦!你的Scrapy XPath选择器出现SyntaxError主要是两个原因导致的:
1. 单引号嵌套冲突
你用单引号包裹了整个XPath表达式,但在concat函数内部又直接使用了单引号——Python解析器会把第一个内层单引号当成整个字符串的结束标记,后面的代码就变成了无效语法,这是最直接的报错原因。
2. 类名匹配逻辑错误
你把多个目标类名连在一起塞进contains的第二个参数里,这种写法只会匹配class属性恰好是这串连续字符的元素,而无法匹配同时包含多个独立类名的元素(毕竟HTML类名是用空格分隔的)。
修正后的两种写法
写法1:转义内层单引号
用反斜杠转义concat里的单引号,同时拆分多个类的检查条件(用and连接):
response.xpath('//div[contains(concat(\' \', normalize-space(@class), \' \'), \' cl-list-header-title \') and contains(concat(\' \', normalize-space(@class), \' \'), \' sc-grid-col-s-12 \') and contains(concat(\' \', normalize-space(@class), \' \'), \' sc-grid-col-l-7 \') and contains(concat(\' \', normalize-space(@class), \' \'), \' sc-grid-col-xl-7 \')]')
写法2:用双引号包裹外层表达式
这种写法更清爽,内层可以直接使用单引号,无需转义:
response.xpath("//div[contains(concat(' ', normalize-space(@class), ' '), ' cl-list-header-title ') and contains(concat(' ', normalize-space(@class), ' '), ' sc-grid-col-s-12 ') and contains(concat(' ', normalize-space(@class), ' '), ' sc-grid-col-l-7 ') and contains(concat(' ', normalize-space(@class), ' '), ' sc-grid-col-xl-7 ')]")
额外说明
concat(' ', normalize-space(@class), ' ')的作用是给处理过冗余空格的类名前后加上空格,避免出现“部分匹配”的问题(比如防止把cl-list-header-title误匹配成cl-list-header-title-extra这类相似类名),这是匹配HTML类名最严谨的写法。
内容的提问来源于stack exchange,提问作者dorinand
相关产品推荐
相关产品推荐

