如何通过文件中的Xidel模式将HTML列表转为JSON对象数组?
解决Xidel提取HTML列表生成JSON对象数组的问题
嘿,我来帮你搞定这个问题!你遇到的核心问题应该是没有把提取到的字段结构化包装成对象,再收集成数组——Xidel不会自动把零散的变量输出转换成JSON对象数组,得明确告诉它怎么构造结构。下面是具体的解决步骤和例子:
1. 确保你的提取模式是结构化的
首先,你需要把每个HTML列表项映射成一个JSON对象,再把所有对象组合成数组。比如假设你的HTML列表长这样:
<ul class="product-list"> <li> <h3 class="product-name">无线耳机</h3> <p class="price">¥299</p> </li> <li> <h3 class="product-name">蓝牙音箱</h3> <p class="price">¥199</p> </li> </ul>
方式一:直接在命令行写提取规则
用object({...})构造单个对象,再用array(...)包裹成数组,配合--output-format=json参数:
xidel your-file.html --extract "array(//ul[@class='product-list']/li/object({ 'name': h3[@class='product-name']/text(), 'price': p[@class='price']/text() }))" --output-format=json
方式二:从文件读取提取模式
如果你的规则比较复杂,把它存成一个XQuery文件(比如extract-rule.xq):
// 提取所有列表项,每个项转成JSON对象,再组成数组 array( //ul[@class='product-list']/li/object({ 'name': h3[@class='product-name']/text(), 'price': p[@class='price']/text() }) )
然后执行命令:
xidel your-file.html --extract-file extract-rule.xq --output-format=json
2. 为什么--output-format=json-wrapped没效果?
json-wrapped参数的作用是把多个独立的结果包装成JSON数组,但如果你的提取规则只是输出零散的变量(比如单独提取name和price),它只会把这些变量值按顺序塞到数组里,而不是组成{name:..., price:...}的对象。只有当你的提取结果是对象序列时,json-wrapped或者直接用json格式才会生成你想要的对象数组。
3. 排查小技巧
- 先测试你的提取规则是否能正确匹配到所有列表项:可以先去掉
object和array,只写//ul[@class='product-list']/li,看Xidel是否返回正确的节点数量。 - 检查XQuery语法:
object({...})里的键要用单引号或双引号,键值对之间用逗号分隔,不要写错。 - 如果还是有问题,可以加上
--verbose参数,查看Xidel的执行日志,看看哪里出了问题。
内容的提问来源于stack exchange,提问作者Mr. Curious
相关产品推荐
相关产品推荐

