如何用Xidel的XPath提取HTML中JavaScript对象内的TARGET值?
用Xidel直接提取Script标签内非标准JS对象的TARGET值
刚好我之前也碰到过类似的场景,xidel自带的XPath扩展函数完全能搞定,不用额外管道grep或者jq这类工具,直接用一个XPath表达式就能提取目标值。
先明确场景示例
假设你的HTML里的script标签内容是这种每行一个键值对的非合法JSON结构:
核心XPath表达式
直接用这个表达式就能精准提取TARGET对应的值:
replace( tokenize(//script[contains(text(),'TARGET')]/text(), '\n')[contains(.,'TARGET')], '^\s*TARGET\s*:\s*["'']?([^"'',\s]+)["'']?\s*,?$', '$1' )
拆解表达式逻辑
- 定位目标Script标签:
//script[contains(text(),'TARGET')]/text()—— 先找到包含TARGET关键字的script标签,取出它的文本内容 - 按行分割文本:
tokenize(..., '\n')—— 把script里的多行文本拆成单独的行节点集合 - 筛选目标行:
[contains(.,'TARGET')]—— 从行集合里挑出包含TARGET的那一行 - 提取目标值:
replace(..., 正则, '$1')—— 用正则匹配去掉冗余内容,只保留TARGET对应的值:^\s*匹配行首的任意空格TARGET\s*:匹配TARGET关键字和后面的冒号(支持冒号前后有空格)["'']?匹配可选的单/双引号(兼容带引号和不带引号的值)([^"'',\s]+)捕获目标值(直到遇到引号、逗号或行尾空格)\s*,?$匹配行尾的空格和可选的逗号$1替换为正则捕获到的目标值
实际命令示例
把表达式放到xidel命令里直接运行:
xidel --xpath 'replace(tokenize(//script[contains(text(),"TARGET")]/text(), "\n")[contains(.,"TARGET")], "^\\s*TARGET\\s*:\\s*["\'""]?([^"\'"",\\s]+)["\'""]?\\s*,?$", "$1")' your-html-file.html
特殊情况适配
如果你的TARGET值包含空格(比如TARGET: 'Hello World'),只需要把正则里的[^"'',\s]+改成[^"'',]+即可,这样就能匹配带空格的值了。
内容的提问来源于stack exchange,提问作者dmcontador
相关产品推荐
相关产品推荐

