【问题标题】:Alternate ways to Access Node Elements访问节点元素的替代方法
【发布时间】:2014-02-06 18:01:11
【问题描述】:

在这个 HTML 源代码中,

<strong>Apple</strong> <span id="apple">Red</span>
<strong>Orange</strong> <span id="orange">Orange</span>
<strong>Beans</strong> <span id="beans">Green</span>
<strong>Carrot</strong> <span id="carrot">Orange</span>
<strong>Banana</strong> <span id="banana">Yellow</span>
<strong>Grapes</strong> <span id="grape">Green</span>

我正在尝试使用 HTML Agility Pack 并检索豆和胡萝卜颜色(绿色、橙色),它们分别是 span id beans 和胡萝卜的内部文本

使用代码

string beans= document.DocumentNode.Descendants("span")
        .Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "beans")
        .ToArray().ElementAt(0).InnerText.Trim();

string carrot = document.DocumentNode.Descendants("span")
        .Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "carrot")
        .ToArray().ElementAt(0).InnerText.Trim();

但是代码搜索 SPAN 节点两次需要更多时间。我想知道是否有任何其他方式可以更有效地访问特定 SPAN 元素。

没有此代码,源代码通过 Agility Pack 更快地加载到文档中。加入这段代码后已经延迟了进程。

如果 HTML 源代码没有特定 ID,它会给出异常。

我想将两种蔬菜颜色(绿色和橙色)分别保存在两个变量中,因为我将使用 LIST 将其转换为逗号分隔的 txt 文件。

【问题讨论】:

  • 您可以将所有这些 LINQ 调用替换为 .First()
  • @SLaks 您的意思是将 ElementAt(0) 更改为 .First()?此外,该页面仅包含一次 beans/cart Span ID
  • 否;我的意思是摆脱ToArray()
  • 您可以改用 XPath
  • @Vkt0rS。 XPath 会比 Linq 快吗?我只是想提高代码性能

标签: c# html-agility-pack getelementbyid


【解决方案1】:

我会尝试将跨度插入字典,假设跨度 ID 是唯一的:

Dictionary<string, HtmlNode> spans = document.DocumentNode.Descendants("span")
    .Where(node => node.Attributes["id"] != null)
    .ToDictionary(node => node.Attributes["id"].Value);

现在您可以通过以下方式快速获得跨度:

HtmlNode span;
if (spans.TryGetValue("apple", out span)) {
    string text = span.InnerText.Trim();
}

或者直接获取内文:

Dictionary<string, string> texts = document.DocumentNode.Descendants("span")
    .Where(node => node.Attributes["id"] != null)
    .ToDictionary(node => node.Attributes["id"].Value,
                  node => node.InnerText.Trim());

现在您可以通过以下方式快速获取文本:

string text;
if (texts.TryGetValue("apple", out text)) {
    Console.WriteLine(text);
}

或者,如果您确定跨度 ID 存在:

string apple = texts["apple"];
string orange = texts["orange"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多