我正在使用Xidel从网页中抓取信息,但我坚持以与页面上不同的顺序导出信息。
例子:
<tr>
<td></td>
<td></td>
<td></td>
<td><a><font><b>{ location:=. }</b></font>{ title:=. }</a></td>
<td>{ dates:=. }</td>
<td></td>
</tr>
此代码将导出为标题,然后是副标题。西德尔有什么办法可以改变顺序吗?
这可能很简单:
xidel -q page.html -e subtitle:=//h2,title:=//h1
像下面这样的东西(带有几个“-e”参数)也可以工作,但就像前面的代码一样,它会首先对页面上的所有字幕和所有标题进行分组,这可能不是你想要的......
xidel -q page.html -e "<div><h2>{subtitle:=.}</h2></div>+" -e "<div><h1>{title:=.}</h1></div>+"
AFAIK,在您的情况下,Xidel 中没有订购功能。但是您可以做的是编写一个脚本,在其中将值保存为 env。使用 xidel --output-format cmd(如果是 Windows)的变量,然后(以正确的顺序)回显/处理这些变量/值。
Dirkk 给出了一个很好的提示(不要分组),您的行可能看起来像这样:
xidel -q page.html --xquery "for $i in //div return (concat('sub:=',$i/h2), concat('title:=',$i/h1))"
我从来没有使用过这个工具,但是快速浏览一下文档并看到它支持 XQuery,我猜以下应该可以工作:
xidel -q page.html --xquery "for $div in //div return ($div/h2, $div/h1)" --output-format xml
这假设您的页面中有几个这样的 div 元素,并且希望首先单独对所有标题进行排序,即不是所有的字幕都在前面。此外,由于您没有给出更具体的 XML 示例,它只是选择所有 div 并对其进行迭代 - 在现实世界的 HTML 中,您可能需要更多特征(如 id 属性)。