在此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文件。
答案 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"];