Наилучший вариант походит на установку Visual Studio, чтобы повредиться на всех необработанных исключениях (Отладка-> диалоговое окно Исключений, установить флажок для "Исключений Общеязыковой среды выполнения" и возможно других также). Тогда запустите свою программу в режиме отладки. Когда код синтаксического анализатора ANTLR выдает исключение, он должен быть пойман Visual Studio и позволить Вам видеть, где он происходит, тип исключительной ситуации, и т.д.
На основе описания, блок выгоды, кажется, корректен, таким образом, одна из нескольких вещей могла происходить:
, Это кажется на потенциальное исключение выпуска № 3.
Собственный Win32
Вы всегда можете использовать IHtmlDocument2 . На данный момент это встроено в Windows. С помощью этого COM-интерфейса вы получаете собственный доступ к мощному парсеру DOM (парсеру IE DOM!).
Что вы думаете об ihtmldocument2, Думаю, это должно помочь.
Модули HTML :: Parser и HTML :: Tree в Perl довольно хорошо разбираются в большинстве типичного так называемого HTML в Интернете. Оттуда вы можете находить элементы, используя запросы, подобные XPath.
Как насчет использования Internet Explorer в качестве элемента управления ActiveX? Это даст вам полностью визуализированную структуру при просмотре страницы.
Используйте парсер DOM
, например, для java, проверьте этот список
Парсеры HTML с открытым исходным кодом в Java (мне нравится использовать кобра)
Или, если вы уверены, например, что хотите только разобрать определенное подмножество вашего html, которое в идеале также является допустимым xml, вы можете использовать некоторый синтаксический анализатор xml для анализа только фрагмента, в который вы его передаете, а затем даже использовать xpath для запроса интересующих вас значений.
XML-парсеры с открытым исходным кодом в Java (например,
Если синтаксический анализатор DOM исключен - по какой-либо причине,
Я бы выбрал какой-нибудь вариант PHP explode ()
или что-то еще, доступное на используемом вами языке программирования.
Вы можете, например, начать с разделения по Это ни в коем случае не оптимальное решение, и оно будет довольно хрупким (почти любое изменение в макет документа нарушит код). Другой вариант - использовать некоторую библиотеку селекторов CSS, например phpQuery или аналогичную для вашего языка программирования.
Я думаю, libxml2, несмотря на свое название, также делает все возможное для синтаксического анализа HTML-кода тегов. Это библиотека C, поэтому она должна удовлетворять вашим требованиям. Вы можете найти его здесь .
Кстати, другой ответ рекомендовал lxml, который является библиотекой Python, но фактически построен на libxml2. Если lxml сработал для него, скорее всего, libxml2 сработает и для вас.
Используйте Beautiful Soup .
Beautiful Soup - это синтаксический анализатор HTML / XML. для Python, который может стать даже недействительным разметку в дерево синтаксического анализа. Это обеспечивает простые, идиоматические способы навигации, поиск и изменение синтаксического анализа дерево. Обычно это спасает программистов часы или дни работы. Также есть Порт Ruby называется Rubyful Soup .
Используйте Html Agility Pack для .NET
Обновление
Поскольку вам нужно что-то родное / антикварное, а разметка, скорее всего, плохая, я бы рекомендовал запустить разметка через Tidy , а затем разбор ее с помощью Xerces
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)
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 div
s, 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.
Альтернативой является использование парсера html dom. К сожалению, похоже, что у большинства из них есть проблемы с плохо сформированным html, поэтому, кроме того, вам нужно сначала запустить его через html tidy или что-то подобное.
Если вы действительно работаете под 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.