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

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

19
задан Charles Stewart 3 January 2010 в 06:52
поделиться

8 ответов

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

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

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

ОБНОВЛЕНИЕ

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

10
ответ дан 30 November 2019 в 02:07
поделиться

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

HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;
45
ответ дан 30 November 2019 в 02:07
поделиться

Вероятно, Вы хотите что-то как Величественный синтаксический анализатор: http://www.majestic12.co.uk/projects/html_parser.php

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

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

2
ответ дан 30 November 2019 в 02:07
поделиться

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

5
ответ дан 30 November 2019 в 02:07
поделиться

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

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

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

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

  3. выдающееся достижение чистый синтаксический анализатор XSLT 2.0 HTML , записанного David Carlisle .

Чтение его кода было бы большим осуществлением изучения для каждого из нас.

Из описания:

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

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

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

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

    Имена элементов печатаются строчными литерами (если режим HTML верен ()), и помещенный в
    пространство имен, указанное параметром пространства имен (который может быть, ""для обозначения
    без пространств имен, если вход не имеет explict объявления пространства имен, в [1 129]
    которые случаются, их будут соблюдать.

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

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

Hope это помогло.

С наилучшими пожеланиями,

Dimitre Novatchev.

2
ответ дан 30 November 2019 в 02:07
поделиться

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

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

  • Вы знаете, будет ли "href" текст всегда нижним регистром?
  • Вы знаете, будет ли это всегда использовать двойные кавычки, одинарные кавычки или ничто вокруг URL?
  • это всегда быть допустимым URL, или необходимо ли объяснить вещи как '# ', положения JavaScript, и т.п.?
  • это возможный работать с документом, где содержание описывает функции HTML (IE: href= мог также быть в документе и не принадлежать тегу привязки)?
  • , Что еще можно сказать нам о документе?
0
ответ дан 30 November 2019 в 02:07
поделиться

Я соглашаюсь с Chris Lively, потому что HTML часто очень хорошо не формируется, Вы, вероятно, лучше всего выключены с регулярным выражением для этого.

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

От здесь на RegExLib должен получить Вас, запустился

1
ответ дан 30 November 2019 в 02:07
поделиться

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

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

0
ответ дан 30 November 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: