使用XPath选择表中的所有文本节点

本文关键字:文本 节点 XPath 选择 使用 | 更新日期: 2023-09-27 18:05:07

这是一个来自开放数据库的关于食物的页面:

http://www.dabas.com/ProductSheet/Details.ashx/121308

我试图使用XPath从这个页面获得一些信息。我感兴趣的表名为:Näringsvärde。我想得到所有的文本节点里面的"Näringsvärde"保存成一个字符串。

这是上面链接的代码的相关部分:

<!DOCTYPE html>
<html>
...
<body>
...
<table class="width100" style="page-break-inside: avoid">
    <caption>
        Produktinformation
            <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleProduktinformation"
                 class="imgCaptionOn" />
    </caption>
    <tbody id="tbodyProduktinformation">
        <tr>
            <td class="col1">
                Ursprungsland:
            </td>
            <td>
Sverige            </td>
        </tr>
        ...
    </tbody>
</table>
<table id="tableHover" class="width100 marginTop30 bgTable">
<tr class="nohover">
<td class="tdLeft48 padding0">
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
        <caption>
            Näringsvärde
                <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
                    class="imgCaptionOn" />
        </caption>
        <tbody id="tbodyNutritiveValues">
            <tr id="divNutritiveValues">
                <td class="padding">
                    <table class="noBorder width100">
                            <tr>
                                <td class="col1">
                                    Tillagningsstatus:
                                </td>
                                <td>Tillagad</td>
                                <td colspan="2">
                                    &amp;amp;nbsp;
                                </td>
                            </tr>
                        ...
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</td>
...
</html>

到目前为止,我尝试使用这样的东西,但它不起作用:

public List<string> GetNaring(string xid) {         
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(xid);
    var xpath = "/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody";
    var links = doc.DocumentNode.SelectNodes(xpath);
    return links.Select(n => n.InnerText).ToList();

}

但这只返回null,我错过了什么?

使用XPath选择表中的所有文本节点

XPath表达式

/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody

不匹配任何节点。

因为你有一个唯一的字符串可以匹配,你应该使用它。在源代码中搜索该字符串,您将发现:

...
<td class="tdLeft48 padding0">
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
        <caption>
            Näringsvärde
                <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
                    class="imgCaptionOn" />
        </caption>
        <tbody id="tbodyNutritiveValues">
            <tr id="divNutritiveValues">
...

该字符串是所需表中caption元素的子元素。您必须获得该元素的字符串值,修剪额外的空格并使用结果与"Näringsvärde"进行比较。您可以使用以下表达式选择正确的table:

//table[normalize-space(caption/text())='Näringsvärde']

一旦你有了正确的表,你可以在其中导航并选择你想要的节点,或者你可以得到字符串值,它是所有后代文本节点的连接:

//table[normalize-space(caption/text())='Näringsvärde']//td

这将返回所有td节点,即文本所在的位置。