无法在 html 列表中检索 li 节点

Posted

技术标签:

【中文标题】无法在 html 列表中检索 li 节点【英文标题】:Failing to retrieve li nodes in an html list 【发布时间】:2014-12-14 04:00:09 【问题描述】:

我正在尝试抓取一个 html 文档,以便从具有以下结构的 ul 列表中获取值:

<ul id="indicators0" class="connectedIndicators ui-sortable">
  <li id="ind-speed" style="">speed=0.014774</li>
  <li id="ind-speed_01" style="display: list-item;"></li>
  ...
</ul>

我可以通过使用 Html Agility Pack 遵循网络上众多示例中的任何一个来轻松访问节点“indicators0”:

HtmlAgilityPack.HtmlNode node = htmlDocument.DocumentNode.SelectSingleNode("//ul[@id='indicators0']");

但是,任何检索 li 节点的尝试都失败了。我正在尝试以下内容:

HtmlAgilityPack.HtmlNode subNode = htmlDocument.DocumentNode.SelectNodes("//ul[@id='indicators0'] //li").FirstOrDefault();

或者

HtmlAgilityPack.HtmlNode subNode = node.Descendants("li").FirstOrDefault();

在这两种情况下都返回空值。欢迎任何帮助。

【问题讨论】:

鉴于这个特定的 HTML 标记作为输入,您的代码应该可以正常工作:dotnetfiddle.net/9Y4Q6A 【参考方案1】:

你试过了吗?

HtmlAgilityPack.HtmlNode subNode = HtmlDocument.DocumentNode.SelectSingleNode("//ul[@id='indicators0']/li[1]");

提取这些值时,您使用 xsl 映射到节点/节点以查找您要查找的项目,并且只是第一个。

在第一个中,理所当然地,将整个 UL 从 html 中拉出。

另外两个我现在看不出有什么问题,抱歉,我很累。

如果我的建议不起作用,您是否进行了调试以找出返回的那个节点是什么?有可能您在正确的 ul 上打了很多,或者您是否可能正在寻找 LI,在它们被动态加载之前(我不确定您是否正在动态加载任何东西,只是一个假设)

如果 LI 的 id 始终相同,您还可以做什么

HtmlAgilityPack.HtmlNode subNode = HtmlDocument.DocumentNode.SelectSingleNode("//li[@id='ind-speed']");

如果这收到了一些东西,那么很有可能你有不止一个 ul,首先是你在 htmlDoc 范围内寻找的描述

【讨论】:

请编辑您的答案以添加对您的代码如何工作以及它如何解决 OP 问题的解释。很多 SO 发帖人都是新手,看不懂你贴的代码。 谢谢。我对动态加载的东西非常好奇,因为 html 从正在运行的在线游戏中检索其数据。那些代码 sn-ps 对我不起作用,因为这些是通常的例程。 显然 html 是由 javascript 生成的,它符合“动态加载”的类别,我必须使用 WebBrowser 对象。你让我走上了正确的道路!

以上是关于无法在 html 列表中检索 li 节点的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 6 - 检索可以编辑节点 x 或简单地获取节点 x 上用户 y 权限的用户列表

在某些情况下无法从neo4j中检索id

JavaScript之节点的创建替换删除插入

Firebase 数据库从子节点 B 中指定的子节点 A 检索对象

HTMLAgilityPack 错误:“无法创建多个节点元素。”

Javascript进阶篇——(DOM—节点---插入删除和替换元素创建元素创建文本节点)—笔记整理