Python 通过XPath解析HTML
在.Net中,我发现了这个很棒的库,它允许您使用XPath轻松解析格式不正确的HTML。我在我的.Net网站上已经使用了几年,但我不得不满足于为我的Python、Ruby和其他项目提供更痛苦的库。有人知道其他语言有类似的库吗?是一个很好的Python库,可以用干净的方式处理凌乱的HTML。问题似乎可以更精确地表述为“如何将HTML转换为XML,以便根据它计算XPath表达式” 以下是两个很好的工具:Python 通过XPath解析HTML,python,html,ruby,xpath,parsing,Python,Html,Ruby,Xpath,Parsing,在.Net中,我发现了这个很棒的库,它允许您使用XPath轻松解析格式不正确的HTML。我在我的.Net网站上已经使用了几年,但我不得不满足于为我的Python、Ruby和其他项目提供更痛苦的库。有人知道其他语言有类似的库吗?是一个很好的Python库,可以用干净的方式处理凌乱的HTML。问题似乎可以更精确地表述为“如何将HTML转换为XML,以便根据它计算XPath表达式” 以下是两个很好的工具: ,一个开源程序,是由开发的基于Java和SAX的工具。这是 一种与SAX兼容的解析器,用Java
是TangSurnor的商业C++端口。
SgmlReader是任何SGML文档(包括内置的HTML支持)上的XmlReader API。还提供了一个命令行实用程序,用于输出格式良好的XML结果。
下载zip文件,包括独立可执行文件和完整的源代码:
对于Ruby,我强烈推荐Jb Evain指出的Hpricot。如果您正在寻找一个更快的基于libxml的竞争对手,Nokogiri(参见)也很不错(它支持XPath和CSS搜索,比如Hpricot,但速度更快)。有一个基本的和一些。有一个免费的XML C实现,名为libxml2,它有一些XPath的api位,我非常成功地使用了这些api位,您可以指定HTML作为加载的文档。对于一些不太完美的HTML文档,这对我来说很有用 在大多数情况下,当入站HTML编码正确并且可以“像xml文档一样”读取时,XPath最有用。您可能想考虑使用特定于此目的的实用程序来清理HTML文档。以下是一个例子:
关于这些XPath工具,你可能会发现大多数实现实际上是基于Python中的LIXML2../P>< P>的预先存在的C或C++库,解析标签汤并生成元素树,允许使用XPath:
查询>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
>>从elementtidy.TidyHTMLTreeBuilder将TidyHTMLTreeBuilder作为TB导入
>>>tb=tb()
>>>tb.feed(“你好,世界”)
>>>e=tb.close()
>>>查找(“)//{http://www.w3.org/1999/xhtml}(p)
我很惊讶没有一个提到lxml。它的速度非常快,可以在任何允许使用CPython库的环境中工作
这是怎么做的
来自lxml导入etree的>>
>>>doc=“”
>>>tree=etree.HTML(doc)
>>>r=tree.xpath('/foo/bar')
>>>蓝(右)
1.
>>>r[0]。标记
“酒吧”
>>>r=tree.xpath('bar')
>>>r[0]。标记
“酒吧”
我得到的最稳定的结果是使用lxml.html的soupparser。您需要安装python lxml和python beautifulsoup,然后可以执行以下操作:
from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
从lxml.html.soupparser导入fromstring
tree=fromstring('here!')
matches=tree.xpath(“/mal[@form=ed]”)
我强烈推荐这几天。这就是Hpricot和Me.FieldToice不使用XPath的一切:你可能想考虑LypXML的Python NeaveRead!改用lxml的BeautifulSoup解析器,因为elementtidy将阻塞未声明的名称空间。我学到了很多!
from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")