Вопрос

Я сохранил HTML-код всей веб-страницы в строку, и теперь Я хочу получить значения «href» из ссылок, желательно с возможностью потом сохранить их в разные строки.Как лучше всего это сделать?

Я попытался сохранить строку как документ .xml и проанализировать ее с помощью навигатора XPathDocument, но (сюрприз) он не слишком хорошо перемещается по документу, не являющемуся XML.

Являются ли регулярные выражения лучший способ достичь того, чего я пытаюсь достичь?

Это было полезно?

Решение

Регулярные выражения — один из способов сделать это, но это может быть проблематично.

Большинство HTML-страниц невозможно проанализировать с помощью стандартных методов HTML, поскольку, как вы выяснили, большинство из них не проходят проверку.

Вы можете потратить время, пытаясь интегрировать HTML аккуратный или аналогичный инструмент, но было бы гораздо быстрее просто создать необходимое регулярное выражение.

ОБНОВЛЯТЬ

На момент публикации этого обновления я получил 15 голосов «за» и 9 «против».Я думаю, что, возможно, люди не читают ни вопрос, ни комментарии к этому ответу.Все, что хотел сделать ОП, — это получить значения href. Вот и все. С этой точки зрения простое регулярное выражение вполне подойдет.Если бы автор хотел проанализировать другие элементы, я бы ни в коем случае не рекомендовал регулярное выражение, как я говорил вначале, в лучшем случае это проблематично.

Другие советы

Я могу порекомендовать HTML-пакет Agility Pack . Я использовал его в нескольких случаях, когда мне нужно было разобрать HTML, и он прекрасно работает. Загрузив в него свой HTML-код, вы можете использовать XPath выражения для запроса документ и получите ваши якорные теги (а также почти все остальное).

HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;

Для работы с HTML всех форм и размеров я предпочитаю использовать пакет HTMLAgility @ http: //www.codeplex .com / htmlagilitypack позволяет писать XPath для нужных вам узлов и возвращать их в коллекцию.

Возможно, вы хотите что-то вроде парсера Majestic: http: //www.majestic12. co.uk/projects/html_parser.php

Есть несколько других опций, которые также могут работать с нестабильным HTML. Hgml Agility Pack стоит посмотреть, как кто-то еще упомянул.

Я не думаю, что регулярные выражения являются идеальным решением для HTML, поскольку HTML не является контекстно-свободным. Вероятно, они дадут адекватный, хотя и неточный результат; даже детерминистическая идентификация URI - сложная проблема.

Всегда лучше, если возможно, не открывать заново колесо.Существует несколько хороших инструментов, которые либо преобразуют HTML в правильно сформированный XML, либо действуют как XmlReader:

Вот три хороших инструмента:

  1. ТегСуп, программа с открытым исходным кодом, представляет собой инструмент на основе Java и SAX, разработанный Джон Коуэн.Это символ SAX-совместимый анализатор, написанный на Java, который вместо того, чтобы анализировать хорошо сформированный или действительный XML, диаграммы HTML, как это можно найти в дикой природе:бедный, противный и жестокий, хотя нередко и далеко не невысокий.TagSoup предназначен для людей, которым приходится обрабатывать эти вещи, используя некое подобие рационального дизайна приложения.Предоставляя интерфейс SAX, он позволяет применять стандартные инструменты XML даже к самому худшему HTML.TagSoup также включает в себя процессор командной строки, который читает файлы HTML и может генерировать либо чистый HTML, либо правильно сформированный XML, который является близким приближением к XHTML.
    Таггл — это коммерческий порт TagSoup на C++.

  2. SgmlReader это инструмент, разработанный Microsoft Крис Ловетт.
    SgmlReader — это API XmlReader для любого документа SGML (включая встроенную поддержку HTML).Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML.
    Загрузите zip-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip

  3. Выдающимся достижением является чистый анализатор HTML XSLT 2.0 написано Дэвид Карлайл.

Чтение его кода было бы отличным учебным упражнением для каждого из нас.

Из описания:

"d:htmlparse(строка)
d:htmlparse(строка,пространство имен,html-режим)

Форма с одним аргументом эквивалентна)
d:htmlparse(строка,'http://ww.w3.org/1999/xhtml',истинный()))

Анализирует строку как HTML и/или XML, используя встроенную эвристику.
управление подразумевает открытие и закрытие элементов.

Он не обладает полными знаниями HTML DTD, но имеет полный список
пустые элементы и полный список определений сущностей.HTML-объекты и
Допускаются все ссылки на десятичные и шестнадцатеричные символы.Обратите внимание на html-сущности
распознаются, даже если html-mode=false().

Имена элементов пишутся строчными буквами (если html-режим имеет значение true()) и помещаются в
пространство имен, указанное параметром пространства имен (который может быть "" для обозначения
no-namespace, если входные данные не содержат явных объявлений пространства имен, в
в этом случае они будут соблюдены.

Имена атрибутов пишутся строчными буквами, если html-mode=true()
"

Читать более подробное описание здесь.

Надеюсь, это помогло.

Ваше здоровье,

Дмитрий Новатчев.

Я согласен с Крисом Лайвли, потому что HTML часто не очень хорошо сформирован, вам, вероятно, лучше всего использовать регулярные выражения для этого.

href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']

С здесь на RegExLib вы можете начать работу

Возможно, вам больше повезет с использованием XML, если вы знаете или можете исправить документ, чтобы он был хотя бы правильно сформирован.Если у вас есть хороший html (или, скорее, xhtml), система xml в .Net должна уметь его обрабатывать.К сожалению, хороший HTML встречается крайне редко.

С другой стороны, регулярные выражения действительно плохо при разборе html.К счастью, вам не нужно обрабатывать полную спецификацию HTML.Все, о чем вам нужно беспокоиться, это анализ href= строки для получения URL-адреса.Даже это может быть непросто, поэтому я не буду пытаться сделать это сразу.Вместо этого я начну с нескольких вопросов, чтобы попытаться установить несколько основных правил.По сути, все они сводятся к следующему: «Как много вы знаете об этом документе?», но вот:

  • Знаете ли вы, всегда ли текст «href» будет в нижнем регистре?
  • Знаете ли вы, всегда ли вокруг URL-адреса будут использоваться двойные, одинарные кавычки или ничего?
  • Всегда ли это действительный URL-адрес или вам нужно учитывать такие вещи, как «#», операторы JavaScript и тому подобное?
  • Можно ли работать с документом, содержание которого описывает возможности html (IE: href= также может находиться в документе и не принадлежать тегу привязки)?
  • Что еще вы можете рассказать о документе?

Я привел здесь некоторый код, который позволит вам использовать " LINQ to HTML " ...

Поиск анализатора C # HTML

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top