Win32.: Как очистить HTML без регулярных выражений?

Наилучший вариант походит на установку Visual Studio, чтобы повредиться на всех необработанных исключениях (Отладка-> диалоговое окно Исключений, установить флажок для "Исключений Общеязыковой среды выполнения" и возможно других также). Тогда запустите свою программу в режиме отладки. Когда код синтаксического анализатора ANTLR выдает исключение, он должен быть пойман Visual Studio и позволить Вам видеть, где он происходит, тип исключительной ситуации, и т.д.

На основе описания, блок выгоды, кажется, корректен, таким образом, одна из нескольких вещей могла происходить:

  1. синтаксический анализатор на самом деле не выдает исключение
  2. , синтаксический анализатор в конечном счете бросает что-то, что не происходит из Системы. Исключение
  3. существует исключение, бросаемое на другой поток, который не обрабатывается

, Это кажется на потенциальное исключение выпуска № 3.

15
задан Cœur 21 October 2018 в 10:27
поделиться

12 ответов

Собственный Win32

Вы всегда можете использовать IHtmlDocument2 . На данный момент это встроено в Windows. С помощью этого COM-интерфейса вы получаете собственный доступ к мощному парсеру DOM (парсеру IE DOM!).

5
ответ дан 1 December 2019 в 03:14
поделиться

Что вы думаете об ihtmldocument2, Думаю, это должно помочь.

0
ответ дан 1 December 2019 в 03:14
поделиться

Модули HTML :: Parser и HTML :: Tree в Perl довольно хорошо разбираются в большинстве типичного так называемого HTML в Интернете. Оттуда вы можете находить элементы, используя запросы, подобные XPath.

0
ответ дан 1 December 2019 в 03:14
поделиться

Как насчет использования Internet Explorer в качестве элемента управления ActiveX? Это даст вам полностью визуализированную структуру при просмотре страницы.

0
ответ дан 1 December 2019 в 03:14
поделиться

Используйте парсер DOM

, например, для java, проверьте этот список

Парсеры HTML с открытым исходным кодом в Java (мне нравится использовать кобра)

Или, если вы уверены, например, что хотите только разобрать определенное подмножество вашего html, которое в идеале также является допустимым xml, вы можете использовать некоторый синтаксический анализатор xml для анализа только фрагмента, в который вы его передаете, а затем даже использовать xpath для запроса интересующих вас значений.

XML-парсеры с открытым исходным кодом в Java (например,

0
ответ дан 1 December 2019 в 03:14
поделиться

Если синтаксический анализатор DOM исключен - по какой-либо причине, Я бы выбрал какой-нибудь вариант PHP explode () или что-то еще, доступное на используемом вами языке программирования.

Вы можете, например, начать с разделения по

, который даст вам каждый результат (не забудьте игнорировать первое место). После этого вы можете зациклить результаты, разделив каждый результат на
и т. Д.

Это ни в коем случае не оптимальное решение, и оно будет довольно хрупким (почти любое изменение в макет документа нарушит код).

Другой вариант - использовать некоторую библиотеку селекторов CSS, например phpQuery или аналогичную для вашего языка программирования.

0
ответ дан 1 December 2019 в 03:14
поделиться

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

Кстати, другой ответ рекомендовал lxml, который является библиотекой Python, но фактически построен на libxml2. Если lxml сработал для него, скорее всего, libxml2 сработает и для вас.

0
ответ дан 1 December 2019 в 03:14
поделиться

Используйте Beautiful Soup .

Beautiful Soup - это синтаксический анализатор HTML / XML. для Python, который может стать даже недействительным разметку в дерево синтаксического анализа. Это обеспечивает простые, идиоматические способы навигации, поиск и изменение синтаксического анализа дерево. Обычно это спасает программистов часы или дни работы. Также есть Порт Ruby называется Rubyful Soup .

3
ответ дан 1 December 2019 в 03:14
поделиться

Используйте Html Agility Pack для .NET

Обновление

Поскольку вам нужно что-то родное / антикварное, а разметка, скорее всего, плохая, я бы рекомендовал запустить разметка через Tidy , а затем разбор ее с помощью Xerces

5
ответ дан 1 December 2019 в 03:14
поделиться

Python:

lxml - faster, perhaps better at parsing bad HTML

BeautifulSoup - if lxml fails on your input try this.

Ruby: (heard of the following libraries, but never tried them)

Nokogiri

hpricot

Though if your parsers choke, and you can roughly pinpoint what is causing the choking, I frankly think it's okay to use a regex hack to remove that portion before passing it to the parser.

If you do decide on using lxml, here are some XPath tutorials that you may find useful. The lxml tutorials kind of assume that you know what XPath is (which I didn't when I first read them.)

Edit: Your post has really grown since it first came out... I'll try to answer what I can.

i don't think XPath can select higher level nodes based on criteria of lower level nodes:

It can. Try //div[@class='vehicleInfo']/parent::div[@class='used_result_container']. Use ancestor if you need to go up more levels. lxml also provides a getparent() method on its search results, and you could use that too. Really, you should look at the XPath sites I linked; you can probably solve your problems from there.

how then do you access repeating structures of data?

It would seem that DOM queries are exactly suited to your needs. XPath queries return you a list of the elements found -- what more could you want? And despite its name, lxml does accept 'loose HTML'. Moreover, the parser recognizes the 'sign-posts' in the HTML and structures the whole document accordingly, so you don't have to do it yourself.

Yes, you are still have to do a search on the structure, but at a higher level of abstraction. If the site designers decide to do a page overhaul and completely change the names and structure of their divs, then that's too bad, you have to rewrite your queries, but it should take less time than rewriting your regex. Nothing will do it automatically for you, unless you want to write some AI capabilities into your page-scraper...

I apologize for not providing 'native Win32' libraries, I'd assumed at first that you simply meant 'runs on Windows'. But the others have answered that part.

8
ответ дан 1 December 2019 в 03:14
поделиться

Альтернативой является использование парсера html dom. К сожалению, похоже, что у большинства из них есть проблемы с плохо сформированным html, поэтому, кроме того, вам нужно сначала запустить его через html tidy или что-то подобное.

0
ответ дан 1 December 2019 в 03:14
поделиться

Если вы действительно работаете под Win32, вы можете использовать для этого крошечный и быстрый COM-объект

пример кода с vbs:

Set dom = CreateObject("htmlfile")
dom.write("<div>Click for <img src='http://www.google.com/images/srpr/logo1w.png'>Google</a></div>")
WScript.Echo(dom.Images.item(0).src)

Вы также можете сделать это в JScript или VB / Dephi / C ++ / C # / Python и т. Д. В Windows. Он напрямую использует макет и синтаксический анализатор mshtml.dll.

2
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

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