我尝试抓取网站上的数据。目标是并非总是给出所有细节的网站。例如,一个配置文件已name, birthday
,另一个配置文件仅name
。
我现在尝试使用xidel和xpath来抓住这个标签,这样就像魅力一样,有时会丢失一些标签(因为某些细节不存在)
所以我要求一个解决方案,我可以用空的标签填充这些notexistant标签,这样我最终得到一组长度相同的数据。
之后我将数据转换为csv,当标签丢失时,所有数据都会关闭一列。
我的xidel请求如下所示:
xidel 'http://www.icaec.org/users/index' -f '//section[@id="content-area"]//article//h5/a' -e 'concat("`",join(//div[@id="members-info"]/(h5 | span) | //div[@class="row pic-professionsal-details"]/div[2]/div | //div[@class="row pic-professionsal-details"]/following-sibling::div/div[1]//div,"`;`"),"`")' | sed "s/\"/\\\"/g" | sed "s/\`/\"/g" >> icaec.csv
有问题的xpath表达式是:
'concat("`",join(//div[@id="members-info"]/(h5 | span) | //div[@class="row pic-professionsal-details"]/div[2]/div | //div[@class="row pic-professionsal-details"]/following-sibling::div/div[1]//div,"`;`"),"`")'
这或多或少是
的串联//div[@id="members-info"]/(h5 | span)
//div[@class="row pic-professionsal-details"]/div[2]/div
//div[@class="row pic-professionsal-details"]/following-sibling::div/div[1]//div
答案 0 :(得分:2)
Xidel支持XPath和XQuery 3.0,因此您可以使用默认值创建替换缺失项目的序列,例如给定
<items>
<item>
<foo>foo 1</foo>
<bar>bar 1</bar>
</item>
<item>
<foo>foo 2</foo>
</item>
<item>
<bar>bar 3</bar>
</item>
</items>
XQuery 3.0表达式
string-join(//item!string-join(((foo, 'foo default')[1], (bar, 'bar default')[1]), ';'), ' ')
输出
foo 1;bar 1
foo 2;bar default
foo default;bar 3
答案 1 :(得分:1)
XPath用于XML文档中存在的 选择 节点。您无法选择尚不存在的节点。 (更新:但请参阅Martin Honnen's answer了解XQuery / XPath 3.0在创建序列时如何指定默认值。今年的Xidel已经更新了完整的XQuery / XPath 3.0支持。)
XSLT用于XML文档的 转换 ,可以重新排列节点或创建新节点。您的需求已经超越了选择范围。