Я хочу скопировать результаты поиска, извлекая значения:
<div class="used_result_container">
...
...
<div class="vehicleInfo">
...
...
<div class="makemodeltrim">
...
<a class="carlink" href="[Url]">[MakeAndModel]</a>
...
</div>
<div class="kilometers">[Kilometers]</div>
<div class="price">[Price]</div>
<div class="location">
<span class='locationText'>Location:</span>[Location]
</div>
...
...
</div>
...
...
</div>
...and it repeats
Вы можете увидеть значения, которые я хочу извлечь, [заключенные в скобки]:
- Url
- MakeAndModel
- Километры
- Цена
- Местоположение
Предполагая, что принять предположение о том, что синтаксический анализ HTML:
- обычно плохая идея
- быстро переходит в безумие
Каким образом это сделать?
Предположения:
- родной Win32
- свободный html
Условные разъяснения:
Native Win32
- .NET/CLR не является родным Win32
- Java не является родным Win32
- perl, python, ruby не являются родными Win32
- предположим, что С++ в Visual Studio 2000 скомпилирован в собственное приложение Win32
Встроенные программы Win32 могут вызывать библиотеку вызовов:
- скопированный исходный код
- DLL, содержащие точки входа функции
- DLL, содержащие COM-объекты
- DLL, содержащие COM-объекты, которые являются COM-вызываемыми оболочками (CCW) вокруг управляемых объектов .NET
Свободный HTML
- xml не является свободным HTML
- xhtml не является свободным HTML
- строгий HTML не потерян HTML
Loose HTML подразумевает, что HTML не является корректным xml (строгий HTML не является хорошо сформированным xml в любом случае), и поэтому синтаксический анализатор XML не может быть использован. На самом деле я присутствовал в предположении, что любой HTML-парсер должен быть щедрым в HTML, который он принимает.
Разъяснение # 2
Предполагая вам нравится идея превратить HTML в объектную модель документа (DOM), как же вы получаете доступ к повторяющимся структурам данных? Как бы вы шли по дереву DOM? Мне нужен DIV node, который является классом used_result_container, у которого есть дочерний DIV класса VehicleInfo. Но узлы необязательно должны быть прямыми детьми друг друга.
Похоже, я торгую одним набором проблем с регулярными выражениями для другого. Если они изменят структуру HTML, мне придется переписать мой код для соответствия - как и с регулярными выражениями. И если мы хотим избежать этих проблем, потому что это проблемы с регулярными выражениями, что я делаю вместо этого?
И я не буду писать парсер регулярных выражений для узлов DOM? Я пишу движок для синтаксического анализа строки объектов, используя внутренний конечный автомат и перехват вперед и назад. Нет, должен быть лучший способ - так, как Джефф намекнул.
я намеренно держал исходный вопрос неопределенным, чтобы не приводить людей к неправильному пути. я не хотел подразумевать, что решение, обязательно, имело какое-либо отношение к:
- прохождение дерева DOM
- запросы xpath
Разъяснение # 3
Образец HTML я при условии, что я обрезана до важных элементов и атрибутов. Механизм, который я использовал для обрезания HTML, основывался на моем внутреннем уклоне, который использует регулярные выражения. Я, естественно, думаю, что мне нужны разные " sign-posts в HTML, которые я ищу.
Поэтому не путайте представленный HTML для всего HTML. Возможно, какое-то другое решение зависит от наличия всего исходного HTML.
Обновление 4
Единственные реквизиты, по-видимому, связаны с использованием библиотеки для преобразования HTML в объектную модель документа (DOM). Тогда вопрос должен был бы стать: , а затем?
Теперь, когда у меня есть DOM, что мне с ним делать? Кажется, что мне все еще нужно ходить по дереву с помощью некоторого регулярного парсера выражения DOM, способного к прямому совпадению и захвату.
В этом конкретном случае мне нужны все узлы used_result_container DIV, которые содержат в качестве дочерних узлов VehicleInfo DIV. Любые узлы DIV used_result_container, которые не содержат VehicleInfo, имеют дочерние элементы, не являются relavent.
Есть ли парсер регулярных выражений DOM с захватом и переадресацией? я не думаю, что XPath может выбирать узлы более высокого уровня на основе критериев узлов нижнего уровня:
\\div[@class="used_result_container" && .\div[@class="vehicleInfo"]]\*
Примечание. Я использую XPath так редко, что я не могу составить гипотетический синтаксис xpath очень хорошо.