使用HTMLAgilityPack選擇所有DOM元素

.net c# dom html html-agility-pack

我一直在尋找類似的問題和在線搜索,但我似乎無法找到解決方案。我要做的是按順序選擇所有DOM元素(等),然後將它們放入arraylist或其他東西。

目前我有

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>

會給你樹像

div
   span
      #text:foo
   #text:bar

熱門答案

我懷疑你看到的#text元素是換行符而不是結束標記。例如這個html輸入:

<div>
    <a href="http://example.org"></a>
</div>

使用您的代碼將輸出:

div
#text   <- line break between <div> and <a>
a
#text  <- line break between </a> and </div>

您可以使用此XPath查詢來獲取那些不是純文本節點的元素(跳過那些不必要的換行符):

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*"))
{
    Console.WriteLine(node.Name);
}

XPath意味著,選擇具有任何名稱( * )的當前元素的所有後代。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因