访问节点元素的替代方法

时间:2014-02-06 18:01:11

标签: c# html-agility-pack getelementbyid

在此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并检索bean和胡萝卜色(绿色,橙色),它们分别是span id bean和carrot的内部文本

使用代码

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 Source没有特定ID,则会产生异常。

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

1 个答案:

答案 0 :(得分: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"];