C# 访问节点元素的其他方法
在这个HTML源代码中C# 访问节点元素的其他方法,c#,html-agility-pack,getelementbyid,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> <st
<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>
但是代码搜索两次跨度节点需要更多的时间。我想知道是否有其他更有效的方法来访问特定的跨度元素
如果没有这些代码,源代码将通过Agility Pack更快地加载到文档中。添加此代码后,进程延迟
如果HTML源没有特定的ID,它会给出一个异常
我想将两种蔬菜颜色(绿色和橙色)分别保存在两个变量中,因为我将使用列表将其转换为逗号分隔的txt文件 我会尝试将span插入字典,假设span id是唯一的:
Dictionary<string, HtmlNode> spans = document.DocumentNode.Descendants("span")
.Where(node => node.Attributes["id"] != null)
.ToDictionary(node => node.Attributes["id"].Value);
或者直接获取内部文本:
Dictionary<string, string> texts = document.DocumentNode.Descendants("span")
.Where(node => node.Attributes["id"] != null)
.ToDictionary(node => node.Attributes["id"].Value,
node => node.InnerText.Trim());
或者,如果您确定span ID存在:
string apple = texts["apple"];
string orange = texts["orange"];
您可以用
.First()
@SLaks替换所有这些LINQ调用,您的意思是将元素(0)更改为.First()?此外,该页面只包含bean/carrot Span ID onceNo;我的意思是摆脱ToArray()
您可以使用XPath来代替。@Vkt0rS。XPath会比Linq更快吗?我只是想提高代码的性能
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);
}
string apple = texts["apple"];
string orange = texts["orange"];