2

我尝试从网站上抓取数据。目标是并非总是提供所有详细信息的站点。例如,一个配置文件已name, birthday给出,而另一个仅给出name

我现在尝试使用 xidel 和 xpath 来掌握这个标签,这就像一个魅力,有时不会有一些标签丢失(因为某些细节不存在)

所以我要求一个解决方案,我可以用一个空的标签填充这些不存在的标签,这样我就可以得到一组长度相同的数据。

之后我将数据转换为 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
4

2 回答 2

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
于 2016-11-13T16:11:45.780 回答
1

XPath 用于选择存在于 XML 文档中的节点。您不能选择尚不存在的节点。(更新:但请参阅Martin Honnen 的回答,了解 XQuery/XPath 3.0 在创建序列时如何指定默认值。今年 Xidel 已更新为完整的 XQuery/XPath 3.0 支持。)

XSLT 用于XML 文档的转换,可以重新排列节点或创建新节点。您的需求已经从选择发展到转型。

于 2016-11-13T14:46:56.223 回答