C# 使用HtmlAlityPack选择所有DOM元素
我一直在寻找类似的问题,并在网上搜索,但我似乎找不到解决办法。我试图做的是按顺序选择所有DOM元素(等等),然后将它们放入arraylist或其他东西中 目前我有C# 使用HtmlAlityPack选择所有DOM元素,c#,html,.net,dom,html-agility-pack,C#,Html,.net,Dom,Html Agility Pack,我一直在寻找类似的问题,并在网上搜索,但我似乎找不到解决办法。我试图做的是按顺序选择所有DOM元素(等等),然后将它们放入arraylist或其他东西中 目前我有 public void Parse() { HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); // There are various options, set as needed
public void Parse()
{
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
// There are various options, set as needed
//htmlDoc.OptionFixNestedTags = true;
// filePath is a path to a file containing the html
htmlDoc.Load("Test.html");
// Use: htmlDoc.LoadHtml(xmlString); to load from a string (was htmlDoc.LoadXML(xmlString)
// ParseErrors is an ArrayList containing any errors from the Load statement
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
{
Console.WriteLine("There was an error parsing the HTML file");
}
else
{
if (htmlDoc.DocumentNode != null)
{
htmlDoc.DocumentNode.Descendants();
Console.WriteLine("document node not null");
//HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
{
Console.WriteLine(node.Name);
}
}
}
}
代码输出节点的名称(html、标题、图像等),但输出结束标记为“#text”。我假设这是因为标记以“/”开头,如何正确读取所有DOM元素?“#text”是文本节点的名称,结束标记在DOM中不表示为任何唯一的标记
<div><span>foo</span> bar</div>
我怀疑您看到的#text
元素是换行符,而不是结束标记。例如,此html输入:
<div>
<a href="http://example.org"></a>
</div>
这意味着,选择当前元素的所有具有任何名称的子元素(
*
)。请提供示例输入并清理代码(删除注释/空检查)以仅显示问题。请注意,“#text”是文本节点的名称。。。结束标记没有自己的节点。这很好地回答了我的问题。如果我不能得到结束标签,那么我需要找到一个新的解决方案。谢谢。+1-换行符也显示为文本,这很好,并且是跳过文本节点的方法。
<div>
<a href="http://example.org"></a>
</div>
div
#text <- line break between <div> and <a>
a
#text <- line break between </a> and </div>
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*"))
{
Console.WriteLine(node.Name);
}