即使某些标签不存在,如何在xpath中始终使用相同数量的结果?

时间:2016-11-13 12:32:30

标签: xpath xidel

我尝试抓取网站上的数据。目标是并非总是给出所有细节的网站。例如,一个配置文件已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

2 个答案:

答案 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]), ';'), '&#10;')

输出

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文档的 转换 ,可以重新排列节点或创建新节点。您的需求已经超越了选择范围。