新手求助:如何用XPath提取宜家产品页的jProductData变量?
如何从指定script标签中提取var jProductData的内容?
嘿,作为XPath新手碰到这种情况太正常啦~你当前的XPath已经精准定位到了目标script标签,但因为整个script块里包含多个JS变量,XPath本身没法直接筛选出单个变量的内容,不过我们可以通过两种实用方案解决:
方案1:XPath定位+字符串/正则处理(最通用)
这是适配绝大多数工具的方法,不管你用Python的lxml、Scrapy,还是浏览器控制台都能行。步骤如下:
- 先用你的原XPath获取整个script的文本内容:
//*[@id="mainPadding"]/script[3]/text() - 拿到文本后,用正则表达式匹配
var jProductData对应的变量内容。比如在Python里可以这么写:
这里的import re # 假设script_text是你通过XPath获取到的文本 script_text = "" match_result = re.search(r'var jProductData = (.*?);', script_text, re.DOTALL) if match_result: jProductData_content = match_result.group(1) print(jProductData_content)re.DOTALL参数很关键,它能让正则里的.匹配换行符,毕竟JS对象通常是多行格式的。
如果是在浏览器控制台测试,代码可以写成这样:
const scriptText = $x('//*[@id="mainPadding"]/script[3]/text()')[0]; const match = scriptText.match(/var jProductData = (.*?);/s); if (match) console.log(match[1]);
方案2:用XPath 2.0+的字符串函数直接提取(限支持的工具)
如果你使用的工具支持XPath 2.0或更高版本(比如Saxon),可以直接在XPath里嵌套字符串处理函数:
substring-before( substring-after( //*[@id="mainPadding"]/script[3]/text(), 'var jProductData = ' ), ';' )
这个表达式的逻辑是:先截取var jProductData = 之后的所有内容,再截取到第一个;之前的部分。不过要注意,如果jProductData的对象内部包含;(比如某些属性值里的分号),这个方法可能会提前截断,所以方案1的正则更稳妥。
内容的提问来源于stack exchange,提问作者Shah Rezza
相关产品推荐
相关产品推荐

