如何使用XPath获取此信息

本文关键字:信息 获取 XPath 何使用 | 更新日期: 2023-09-27 18:23:49

我正在为其中一个网站编写爬网程序,遇到了这个问题。

从此HTML。。。

<div class="Price">
    <span style="font-size: 14px; text-decoration: line-through; color: #444;">195.90 USD</span>
    <br />
    131.90 USD           
</div>

我只需要使用XPath获得131.90美元

尝试过这个。。。

"//div[@class='Price']"

但它返回不同的结果。

我怎样才能做到这一点?

编辑

我正在使用这个C#代码(为了演示而简化)

protected override DealDictionary GrabData(HtmlAgilityPack.HtmlDocument html) {
var price = Helper.GetInnerHtml(html.DocumentNode, "//div[@class='Price']/text()");

}

助手类

public static class Helper {
    public static String GetInnerText(HtmlDocument doc, String xpath) {
        var nodes = doc.DocumentNode.SelectNodes(xpath);
        if (nodes != null && nodes.Count > 0) {
            var node = nodes[0];
            return node.InnerText.TrimHtml();
        }
        return String.Empty;
    }
    public static String GetInnerText(HtmlNode inputNode, String xpath) {
        var nodes = inputNode.SelectNodes(xpath);
        if (nodes != null && nodes.Count > 0) {
            var node = nodes[0];
            var comments = node.ChildNodes.OfType<HtmlCommentNode>().ToList();
            foreach (var comment in comments)
                comment.ParentNode.RemoveChild(comment);
            return node.InnerText.TrimHtml();
        }
        return String.Empty;
    }
    public static String GetInnerHtml(HtmlDocument doc, String xpath) {
        var nodes = doc.DocumentNode.SelectNodes(xpath);
        if (nodes != null && nodes.Count > 0) {
            var node = nodes[0];
            return node.InnerHtml.TrimHtml();
        }
        return String.Empty;
    }
    public static string GetInnerHtml(HtmlNode inputNode, string xpath) {
        var nodes = inputNode.SelectNodes(xpath);
        if (nodes != null && nodes.Count > 0) {
            var node = nodes[0];
            return node.InnerHtml.TrimHtml();
        }
        return string.Empty;
    }
}

如何使用XPath获取此信息

您尝试的XPath是一个良好的开端:

//div[@class='Price']

这将选择Xml文档中的任何<div>元素。您可以将该选择限制为具有值为Priceclass属性的<div>元素。

到目前为止,一切都很好,但当您选择一个<div>元素时,您将得到一个包含其所有内容的<div>元素。

在上面显示的Xml片段中,您有以下层次结构:

<div> element
    <span> element
        text node
    <br> element
    text node

因此,您真正感兴趣的是后一个文本节点。您可以在XPath中使用text()来选择任何文本节点。在这种情况下,您对第一个文本节点感兴趣,它是您找到的<div>元素的直接子节点,您的XPath应该如下所示:

//div[@class='Price']/text()