Win32 .:如何在没有正则表达式的情况下擦除HTML?
最近的一个
blog entry by a Jeff Atwood说,你绝对不应该使用正则表达式来解析HTML,但是不能给出一个替代方法.
我想要搜索搜索结果,提取值: <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 你可以看到我想要提取的值,[括在括号中]: >网址 假设我们接受解析HTML的前提: 一般都是坏主意 做什么的方法? 假设: >本机Win32 假设澄清: 本地Win32 > .NET / CLR不是本机的Win32 本地Win32应用程序可以调用库代码: >复制源代码 宽松的HTML > xml不是松散的HTML 宽松的HTML意味着HTML不是格式正确的xml(严格的HTML格式不太完整),所以XML解析器不能使用.实际上,我认为任何HTML解析器必须在它接受的HTML中是大方的假设. 澄清#2 假设您喜欢将HTML转换为文档对象模型(DOM),那么您如何访问重复的数据结构?你将如何走DOM树?我需要一个DIV节点,它是一类used_result_container,它具有一个类的车辆信息的子DIV.但节点不一定是彼此的直接子节点. 听起来我正在为另一个交易一套正则表达式问题.如果他们改变HTML的结构,我将不得不重写我的代码来匹配 – 就像我将用正则表达式.假设我们想避免这些问题,因为那些是正则表达式的问题,我该怎么办? 我会不会为DOM节点编写正则表达式解析器?我正在编写一个引擎来解析一串对象,使用内部状态机和前进和后退捕获.不,必须有一个更好的方式 – 杰夫提到的方式. 我故意保持原来的问题模糊,以免引导人们走错路.我不想暗示解决方案必然与之有关: >走DOM树 澄清#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语法.
蟒蛇:
lxml – 更快,也许更好地解析不良的HTML BeautifulSoup – 如果您输入的lxml失败,请尝试此操作. Ruby:(听说过以下图书馆,但从未尝试过) Nokogiri hpricot 尽管如果您的解析器阻塞,您可以粗略地确定导致窒息的原因,我坦白地认为,在将其传递给解析器之前,请使用正则表达式hack删除该部分. 如果你决定使用lxml,那么here是可以找到的some XPath教程. lxml教程就是假设你知道XPath是什么(当我第一次阅读它的时候我没有看到) 编辑:自从第一次出现以来,你的帖子已经有所增长了,我会尽力回答我能做的事情.
它可以.尝试// div [@ class =’vehicleInfo’] / parent :: div [@ class =’used_result_container’].使用祖先,如果你需要上升更多的水平. lxml还在其搜索结果中提供了一个getparent()方法,您也可以使用它.真的,你应该看看我链接的XPath网站;你可以从那里解决你的问题.
看来,DOM查询完全符合您的需求. XPath查询返回您找到的元素的列表 – 您还想要什么?尽管它的名称,lxml确实接受“松散的HTML”.此外,解析器识别HTML中的“签名”,并相应地构建整个文档,因此您不必自己动手. 是的,你仍然需要对结构进行搜索,但是在更高的抽象层次上.如果站点设计者决定进行页面修改,并彻底改变其div的名称和结构,那么这太糟糕了,你必须重写你的查询,但是比重写正则表达式要花费更少的时间.没有什么会自动为您做,除非你想写一些AI功能到您的页面刮刀… 对于不提供’本地Win32’库的我深表歉意,我首先假设您只是想在Windows上运行.但其他人回答了这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows – Node.js 0.5.x的递归目录创建
- Drools.NET与Windows Workflow Foundation(WF)
- Windows 8显然从压缩的HTTP响应中删除内容编码头
- windows-phone-8 – NavigationService删除完整的后退导航
- Windows如何压缩tar gz格式
- Win10系统修改主机名、用户名称和密码、以及C盘中的用户文件
- win7
- windows – 锁定桌面USB端口
- 通过其pIDL识别Windows Shell特殊文件夹(即获取其CSIDL)(现
- windows-server-2008 – 强制Windows Server 2008使用旧版B
- Windows server 2008 R2 配置AD域控服务并为用户
- windows – 检查我的托管服务帐户的安装位置的支
- Windows 7中的SVN的Windows资源管理器列(详细视图
- windows-server-2012 – 在RDP会话中禁用Metro:
- windows-server-2008-r2 – 监视服务器上IOPS的实
- active-directory – 降级DC的问题,仍然在目录中
- windows-server-2008 – 即使添加了防火墙例外,W
- Windows下配置Git服务器和客户端 scm-manager
- Win32小游戏--蜘蛛纸牌
- windows-server-2008-r2 – Exchange 2010从多个