通过XPath解析HTML

Tri*_*ick 27 html ruby python xpath parsing

在.Net中,我找到了这个很棒的库,HtmlAgilityPack,它允许您使用XPath轻松解析非格式良好的HTML.我已经在我的.Net站点中使用了这几年,但是我不得不为我的Python,Ruby和其他项目解决更多痛苦的库.是否有人知道其他语言的类似库?

Jag*_*dha 52

我很惊讶没有提到lxml.它速度极快,可以在允许CPython库的任何环境中工作.

以下是使用lxml通过XPATH解析HTML的方法.

>>> from lxml import etree
>>> doc = '<foo><bar></bar></foo>'
>>> tree = etree.HTML(doc)

>>> r = tree.xpath('/foo/bar')
>>> len(r)
1
>>> r[0].tag
'bar'

>>> r = tree.xpath('bar')
>>> r[0].tag
'bar'
Run Code Online (Sandbox Code Playgroud)

  • 并不意味着你可以回答它.理想情况下,即使经过很长一段时间,最好的答案也会冒出来.顺便说一句,你的答案只解析XML,而不是HTML.你应该包含一个`HTMLParser`实例. (8认同)

Aar*_*paa 7

在python中,ElementTidy解析标签汤并生成一个元素树,允许使用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>
Run Code Online (Sandbox Code Playgroud)

  • **危险!**使用BeautifulSoup解析器代替lxml,因为elementtidy将阻塞未声明的命名空间.我学到了很多东西! (10认同)

Ned*_*der 5

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

  • BeautifulSoup不使用xpath :) (17认同)

Gar*_*son 5

我用过的最稳定的结果一直是使用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]")
Run Code Online (Sandbox Code Playgroud)