【问题标题】:xpath: extract the trailing text of a nodexpath:提取节点的尾随文本
【发布时间】:2020-09-30 21:57:37
【问题描述】:

我有一个包含以下内容的 html 文件。

...
<table><tbody>
...
            <tr>
              <td><span class="myclass">C</span>
                <a href="/myurl" title="myclick">mytext</a>
                   tailing text
              </td>
            </tr>
...
</tbody></table>
...

我想提取信息并以以下格式写入 TSV 文件。

C<TAB>mytext<T>tailing text

到目前为止,我只能用这个 xpath 代码来提取前两列。谁能告诉我如何提取第三列?谢谢。

xidel -s -e '//table/tbody/tr/td/join((span, a), x:cps(9))' - < infile.html

【问题讨论】:

    标签: xpath xquery xidel


    【解决方案1】:

    如果您使用//table/tbody/tr/td/string-join(node()[normalize-space()], x:cps(9)),您会得到三列,但最后一列可能在文本前后包含空格,因此//table/tbody/tr/td/string-join(node()[normalize-space()]/normalize-space(), x:cps(9)) 可能会确保您不会得到未在所需结果中显示的空格。

    【讨论】:

    • 我在第二列有一个额外的 TAB。你知道为什么吗? xidel -s --xpath '//table/tbody/tr/td/string-join(node()/normalize-space(), x:cps(9))' - &lt;&lt;&lt; '&lt;table&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;span class="myclass"&gt;C&lt;/span&gt; &lt;a href="/myurl" title="myclick"&gt;mytext&lt;/a&gt; tailing text &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;' |cat -T 输出C^I^Imytext^Itailing text
    • 好吧,你没有使用我的建议,而是一个变体,即使减少为空字符串,也可以拾取空白文本节点。为了防止我在您删除的两个建议中使用了谓词 [normalize-space()]
    • 但即使没有尾随文本,我也需要尾随空字段。
    • 那你需要说明你想要哪些文本节点,哪些不需要。也许 zx485 和a/following-text() 的答案是你想要的,它明确选择span 孩子、a 孩子和a 孩子之后的文本,而我试图选择任何孩子的任何文本,空白规范化后,有文本内容。但是,如果您希望在 a 元素之后读出空白,则该方法不起作用。
    • //table/tbody/tr/td/join((span, a, a/following::text()[1], a/@href), x:cps(9)) 是我需要的(我添加了对href的需要)。但它太慢了。但是您的代码似乎要快得多,但它会修剪我仍想保留的空白字段。我想知道是否可以采取任何措施来实现快速性能,同时保持空的尾随字段。
    【解决方案2】:

    你可以使用这个命令:

    xidel infile.html --xpath '//table/tbody/tr/td/string-join((span, "<TAB>", a, "<T>", a/following::text()[1]))'
    

    xidel --xpath '//table/tbody/tr/td/string-join((span, "<TAB>", a, "<T>", a/following::text()[1]))' - < infile.html
    

    另一种方法是

    xidel infile.html --xpath '//table/tbody/tr/td/concat(span, "<TAB>", a, "<T>", a/following-sibling::text()[1])' 
    

    输出是 - 在所有三种情况下:

    C<TAB>mytext<T>tailing text
    

    【讨论】:

    • trs 很多的时候这个好像很慢。是因为a/following::text()[1]吗?谢谢。
    • 另一种方法是xidel infile.html --xpath '//table/tbody/tr/td/concat(span, "&lt;TAB&gt;", a, "&lt;T&gt;", a/following-sibling::text()[1])'。但这是绝对最低限度。我怀疑它会变得更好。性能问题可能是由于表达式中的// 而发生的,因为这会检查整个文档中的所有表
    • 我不认为// 是问题,因为删除a/following-sibling::text()[1] 会使运行完成得更快。您是说//a/following-sibling::text()[1] 结合会导致性能问题吗?谢谢。
    • 您确定保留了“infile.html”中的空格(如 OP 所示)吗?如果是这样,那么您应该会看到 a/following::text()[1] 返回 3 行; tailing text 周围有很多空白。此外,OP 想要创建一个 TSV 文件,所以我怀疑作为字符串的文字“”和“”是他/她所追求的。
    • @Reino 是的。我需要 TAB 字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多