0

我正在为其中一个站点编写 Crawler 并遇到了这个问题。

从这个 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;
    }
}
4

1 回答 1

1

您尝试的 XPath 是一个好的开始:

//div[@class='Price']

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

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

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

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

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

//div[@class='Price']/text()
于 2013-07-18T11:39:59.920 回答