如何使用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是一个良好的开端:
//div[@class='Price']
这将选择Xml文档中的任何<div>
元素。您可以将该选择限制为具有值为Price
的class
属性的<div>
元素。
到目前为止,一切都很好,但当您选择一个<div>
元素时,您将得到一个包含其所有内容的<div>
元素。
在上面显示的Xml片段中,您有以下层次结构:
<div> element
<span> element
text node
<br> element
text node
因此,您真正感兴趣的是后一个文本节点。您可以在XPath中使用text()
来选择任何文本节点。在这种情况下,您对第一个文本节点感兴趣,它是您找到的<div>
元素的直接子节点,您的XPath应该如下所示:
//div[@class='Price']/text()