Может ли Html Agility Pack использоваться для анализа фрагментов HTML?

.net c# html html-agility-pack parsing

Вопрос

Мне нужно получить элементы LINK и META с страниц ASP.NET, пользовательских элементов управления и мастер-страниц, захватить их содержимое, а затем записать обновленные значения в эти файлы в утилите, над которой я работаю.

Я мог бы попытаться использовать регулярные выражения, чтобы захватить только эти элементы, но есть несколько проблем с этим подходом:

  • Я ожидаю, что многие входные файлы будут содержать разбитый HTML (отсутствующие / внеуровневые элементы и т. Д.)
  • Элементы SCRIPT , содержащие комментарии и / или VBScript / JavaScript, которые выглядят как действительные элементы и т. Д.
  • Мне нужно иметь специальные комментарии IE и комментарии META и LINK внутри IE условных комментариев
  • Не говоря уже о том, как HTML не является обычным языком

Я провел некоторое исследование для парсеров HTML в .NET, и многие сообщения SO и блоги рекомендуют HTML Agility Pack . Я никогда не использовал его раньше, и я не знаю, может ли он разбирать сломанные фрагменты HTML и HTML. (Например, представьте, что пользовательский элемент управления содержит только элемент HEAD с некоторым содержимым в нем - без HTML или BODY .) Я знаю, что могу читать документацию, но это спасло бы меня довольно много времени, если кто-то мог бы посоветовать. (Большинство сообщений SO включают в себя синтаксический анализ полных HTML-страниц.)

Принятый ответ

Абсолютно, это то, чем он превосходит.

Фактически, многие веб-страницы, которые вы найдете в дикой природе, можно охарактеризовать как фрагменты HTML из-за отсутствия тегов <html> или неправильно закрытых тегов.

HtmlAgilityPack имитирует то, что браузер должен делать - попытайтесь понять, что иногда представляет собой беспорядок несоответствующих тегов. Недостаточная наука, но HtmlAgilgityPack делает это очень хорошо.


Популярные ответы

Альтернативой Html Agility Pack является CsQuery , порт C # jQuery, из которых я являюсь основным автором. Он позволяет использовать селектор CSS и полный API запросов для доступа к DOM и управления ими, что для многих проще, чем XPATH. Кроме того, это синтаксический анализатор HTML, разработанный специально с целым рядом целей, и существует несколько вариантов синтаксического анализа HTML: как полный документ (отсутствующие html, body теги html, body будут добавлены, и любой потерянный контент перемещается внутри тела); в качестве блока контента (это означает, что он не будет завернут как полный документ, но дополнительные теги, такие как tbody , которые по-прежнему обязательны для DOM, автоматически добавляются, как и браузеры), и как истинный фрагмент, где нет тегов (например, если вы просто работаете со строительными блоками).

Подробнее см. В создании нового DOM .

Кроме того, HTML-парсер CsQuery был разработан для оценки спецификации HTML5 для дополнительных закрывающих тегов. Например, закрытие p тэгов является необязательным, но существуют определенные правила, которые определяют, когда блок должен быть закрыт. Чтобы создать тот же DOM, что и браузер, парсер должен реализовать те же правила. CsQuery делает это, чтобы обеспечить высокую степень совместимости с DOM браузера для данного источника.

Использование CsQuery очень просто, например

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

Наконец, CsQuery индексирует документы по селекторам классов, id, атрибутов и тегов очень быстро по сравнению с Html Agility Pack.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему