Python 通过XPath解析HTML

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

在.Net中,我发现了这个很棒的库,它允许您使用XPath轻松解析格式不正确的HTML。我在我的.Net网站上已经使用了几年,但我不得不满足于为我的Python、Ruby和其他项目提供更痛苦的库。有人知道其他语言有类似的库吗?

是一个很好的Python库,可以用干净的方式处理凌乱的HTML。

问题似乎可以更精确地表述为“如何将HTML转换为XML,以便根据它计算XPath表达式”

以下是两个很好的工具:

  • ,一个开源程序,是由开发的基于Java和SAX的工具。这是 一种与SAX兼容的解析器,用Java编写,它不解析格式良好或有效的XML,而是像在野外一样解析HTML:糟糕、令人讨厌、粗野,但通常并不简短。TagSoup是为那些必须使用某种类似于rational应用程序设计的方式来处理这些内容的人而设计的。通过提供SAX接口,它允许将标准XML工具应用于最糟糕的HTML。TagSoup还包括一个命令行处理器,用于读取HTML文件,并可以生成干净的HTML或格式良好的XML,这些XML与XHTML非常接近。
    是TangSurnor的商业C++端口。

  • 是由Microsoft开发的工具。
    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]")