Подтвердить что ты не робот

С# - Лучший подход к анализу веб-страницы?

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

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

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

4b9b3361

Ответ 1

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

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

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

UPDATE

Во время этого обновления я получил 15 и 9 downvotes. Я думаю, что, может быть, люди не читают вопрос и не комментируют этот ответ. Все, что хотел сделать OP, это захватить значения href. Что это. С этой точки зрения простое регулярное выражение просто отлично. Если автор хотел разобрать другие элементы, тогда я бы не рекомендовал регулярное выражение, как я сказал в начале, это проблематично в лучшем случае.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Есть еще несколько вариантов, которые могут иметь дело с flaky html. Html Agility Pack стоит посмотреть, как сказал кто-то еще.

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

Ответ 5

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

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

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

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

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

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

Из описания:

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

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

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

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

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

  Названия атрибутов имеют нижнее значение, если html-mode = true() "

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

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

Приветствия,

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

Ответ 6

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

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

Из здесь в RegExLib вам нужно начать

Ответ 7

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

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

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