0

私はサイトの 1 つにクローラーを書いていて、この問題に遭遇しました。

この 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 USDだけを取得する必要があります。

これを試した...

"//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']

<div>これにより、Xml ドキュメント内の任意の要素が選択されます。その選択を、値が の属性を<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 に答える