<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
你可以看到我想要提取的值,[括在括号中]:
>网址
> MakeAndModel
>公里
>价格
>位置
假设我们接受解析HTML的前提:
一般都是坏主意
> rapidly devolves into madness
做什么的方法?
假设:
>本机Win32
>松散的html
假设澄清:
本地Win32
> .NET / CLR不是本机的Win32
> Java不是本机的Win32
> perl,python,ruby不是本机的Win32
>假设C在Visual Studio 2000中编译成本机的Win32应用程序
>复制源代码
>包含功能入口点的DLL
>包含COM对象的DLL
>包含COM对象的DLL,这些对象是托管.NET对象周围的COM可调用的包装器(CCW)
宽松的HTML
> xml不是松散的HTML
> xhtml不是松散的HTML
>严格HTML不宽松的HTML
宽松的HTML意味着HTML不是格式正确的xml(严格的HTML格式不太完整),所以XML解析器不能使用.实际上,我认为任何HTML解析器必须在它接受的HTML中是大方的假设.
澄清#2
假设您喜欢将HTML转换为文档对象模型(DOM),那么您如何访问重复的数据结构?你将如何走DOM树?我需要一个DIV节点,它是一类used_result_container,它具有一个类的车辆信息的子DIV.但节点不一定是彼此的直接子节点.
听起来我正在为另一个交易一套正则表达式问题.如果他们改变HTML的结构,我将不得不重写我的代码来匹配 – 就像我将用正则表达式.假设我们想避免这些问题,因为那些是正则表达式的问题,我该怎么办?
我会不会为DOM节点编写正则表达式解析器?我正在编写一个引擎来解析一串对象,使用内部状态机和前进和后退捕获.不,必须有一个更好的方式 – 杰夫提到的方式.
我故意保持原来的问题模糊,以免引导人们走错路.我不想暗示解决方案必然与之有关:
>走DOM树
> xpath查询
澄清#3
我提供的示例HTML修剪了重要的元素和属性.我用来修剪HTML的机制是基于我使用正则表达式的内部偏差.我自然认为我需要在我寻找的HTML中的各种“签名.
所以不要混淆整个HTML中呈现的HTML.也许一些其他解决方案取决于所有原始HTML的存在.
更新4
唯一支持的解决方案似乎涉及使用库将HTML转换为文档对象模型(DOM).那么问题就是要成为:那么什么呢?
现在我有DOM,我该怎么办?似乎我仍然必须用某种常规的DOM表达式解析器来走树,能够进行前向匹配和捕获.
在这种特殊情况下,我需要所有包含vehicleInfo DIV节点的used_result_container DIV节点作为子节点.任何不包含车辆信息的used_result_container DIV节点都有一个小孩不相关.
是否有一个具有捕获和转发匹配的DOM正则表达式解析器?我不认为XPath可以根据较低级节点的标准选择更高级的节点:
\\div[@class="used_result_container" && .\div[@class="vehicleInfo"]]\*
注意:我很少使用XPath,我不能很好地弥补假设的xpath语法.