【问题标题】:How to change order of exported variable in Xidel?如何更改 Xidel 中导出变量的顺序?
【发布时间】:2014-10-14 05:36:36
【问题描述】:

我正在使用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有什么办法可以改顺序吗?

【问题讨论】:

    标签: html xpath xquery scraper xidel


    【解决方案1】:

    我从未使用过此工具,但快速查看文档并发现它支持 XQuery,我猜以下应该可以工作:

    xidel -q page.html --xquery "for $div in //div return ($div/h2, $div/h1)" --output-format xml 
    

    这假设您的页面中有几个这样的 div 元素,并且希望首先单独对所有标题进行排序,即不是所有的字幕都在前面。此外,由于您没有给出更具体的 XML 示例,它只是选择所有 div 并对其进行迭代 - 在现实世界的 HTML 中,您可能需要更多特征特性(如 id 属性)。

    【讨论】:

    • 谢谢!我更新了代码以展示我正在尝试解决的问题的更好示例。我将如何在 XQuery 中评估它?
    • 首先,如果你编辑你可以并且应该直接修改问题,不需要更新部分。你的 XML 基本上还是一样的。您可以使用//tr 选择所有表格行,但如果您在此页面中有其他表格,这些表格也会被选中。使用网页的相同唯一标识元素,例如一个想法,或者一个 h1 或 h2 标题,一些特征链接......
    【解决方案2】:

    这可能很简单:

    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))"
    

    【讨论】:

    • 感谢您的回答!实际页面比我发布的更复杂。例如:xidel page.html -e " { location:= . }{ 标题:=. } { 日期:=. } +"但这会按照变量在页面中的顺序打印。我将如何更改订单?有什么想法吗?
    • 谢谢@MatrixView 我会更多地研究保存/回显变量。听起来是个可行的选择!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多