XPath:如何获取两个兄弟节点的连接文本?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPath:如何获取两个兄弟节点的连接文本?相关的知识,希望对你有一定的参考价值。

我想知道如何获得两个兄弟节点的连接文本。

这是我的代码。

string html =
    "<html>" +
    "   <div class='abc'>" +
    "       <h3><a href='def'>ghi</a></h3>" +
    "       <div>text1</div>" +
    "       <div>text2</div>" +
    "   </div>" +
    "   <div class='abc'>" +
    "       <h3><a href='jkl'>mno</a></h3>" +
    "       <div>text3</div>" +
    "       <div>text4</div>" +
    "   </div>" +
    "</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='abc']");
HtmlNodeCollection nodes2, nodes3;
foreach (HtmlNode node in nodes)
{
    nodes2 = node.SelectNodes(".//h3/a");
    nodes3 = node.SelectNodes("?????????????");
}

我想得到结果

text1text2

然后

text3text4

如何编写查询替换问号?我知道我可以使用foreach迭代节点来获取文本。但我必须使用XPath查询执行此操作。

谢谢。

答案

我不确定我理解,但鉴于外部div元素是您的上下文,以下表达式:

concat(div[1],div[2])

将返回第一个和第二个子div元素的字符串值的串联。


顺便说一句,h3/html/div的直接孩子,所以没有必要在这个表达式中使用//

nodes2 = node.SelectNodes(".//h3/a");

您可能希望将其减少到

nodes2 = node.SelectNodes("h3/a");
另一答案
concat(//div[@class='abc'][1]/div[1]/text(), //div[@class='abc'][1]/div[2]/text())

应该给:text1text2

concat(//div[@class='abc'][2]/div[1]/text(), //div[@class='abc'][2]/div[2]/text())

应该给text3text4

这应该适用于htmlagilitypack中使用的XPATH 1.0。

另一答案

@MathiasMüller的评论是回答。

SelectNodes返回节点列表,我们必须使用C#编程浏览集合节点。

错误是我正在等待文本结果。

以上是关于XPath:如何获取两个兄弟节点的连接文本?的主要内容,如果未能解决你的问题,请参考以下文章

Xpath 从兄弟节点的父节点获取值

xpath如何获取节点下的所有子孙节点的文本

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

如何使用 Xpath java 仅在兄弟姐妹中查找节点?

Python爬虫编程思想(44):XPath实战:节点轴选择

selenium+xpath 文本信息定位