Получить все идентификаторы div на html-странице с помощью Html Agility Pack

Как получить все идентификаторы div на html-странице с помощью Html Agility Pack. Я пытаюсь получить все идентификаторы и положить их в коллекцию.

<p>
    <div class='myclass1'>
        <div id='f'>
        </div>  
        <div id="myclass2">
            <div id="my"><div id="h"></div><div id="b"></div></div>
        </div>
    </div>
</p>

Код:

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.OptionFixNestedTags=true;
htmlDoc.Load(filePath);    
HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("div"); 

Как получить коллекцию всех идентификаторов div?

2 ответа

Решение

Если вы просто хотите идентификаторы, вы можете получить коллекцию этих id атрибутивные узлы вместо получения коллекции div узлы элементов. Например:

List<string> ids = new List<string>();
foreach(XmlNode node in doc.SelectNodes("//div/@id"))
{
    ids.Add(node.InnerText);
}

Это пропустит div элементы, которые не имеют идентификатора, такие как <div class='myclass1'> элемент в вашем примере.

"//div/@id" строка XPath XPath - это технология, которую очень удобно изучать, если вы много работаете с XML или, в данном случае, с HTML через библиотеку Agility Pack. XPath - это отраслевой стандарт, который позволяет выбирать подходящие узлы в документе XML.

  • // означает, что вы хотите выбрать следующий узел в качестве дочернего узла текущего узла или любого из его потомков. Поскольку текущий узел является корневым узлом документа, он найдет совпадающие узлы в любом месте документа.
  • div это имя элемента, которому мы хотим соответствовать. Итак, в этом случае мы говорим, чтобы найти все div элементы в любом месте документа.
  • / указывает, что вы хотите дочерний узел. В этом случае id атрибут является потомком div элемент, поэтому сначала мы говорим, что мы хотим div элемент, то нам нужно косая черта, чтобы сказать, что мы хотим один из div дочерние узлы элемента.
  • @id означает, что мы хотим найти все id атрибутов. @ Символ указывает, что это имя атрибута, а не имя элемента.

Yo может получить коллекцию div, передав синтаксис xpath

Как это

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

    htmlDoc.OptionFixNestedTags=true;

    htmlDoc.Load(filePath);

 foreach(HtmlNode div doc.DocumentElement.SelectNodes("//div"))
 {
///.. code here
 }
Другие вопросы по тегам