Python html解析实际上有效

vir*_*tor 15 html python parsing

我正在尝试用Python解析一些html.有些方法之前确实有效......但是现在没有变通方法我就无法实际使用.

  • SGMLParser离开后,beautifulsoup有问题
  • html5lib无法解析"那里"的一半
  • lxml试图对于典型的html"太正确"(属性和标签不能包含未知的命名空间,或者抛出异常,这意味着几乎没有可以解析具有Facebook连接的页面)

这些天还有哪些其他选择?(如果他们支持xpath,那会很棒)

Tim*_*ara 20

html在解析HTML时,请确保使用该模块lxml:

>>> from lxml import html
>>> doc = """<html>
... <head>
...   <title> Meh
... </head>
... <body>
... Look at this interesting use of <p>
... rather than using <br /> tags as line breaks <p>
... </body>"""
>>> html.document_fromstring(doc)
<Element html at ...>
Run Code Online (Sandbox Code Playgroud)

所有的错误和异常都会消失,你将会得到一个非常快速的解析器,它通常比BeautifulSoup更好地处理HTML汤.


Pau*_*McG 10

我已经在许多HTML页面抓取项目中使用了pyparsing.它在BeautifulSoup和一端的完整HTML解析器之间是一种中间立场,而正则表达式的过低级别方法(这种方式就是疯狂).

通过pyparsing,您通常可以通过识别要尝试提取的页面或数据的特定子集来获得良好的HTML抓取结果.这种方法避免了尝试解析页面上的所有内容的问题,因为您感兴趣的区域之外的某些有问题的HTML可能会抛弃全面的HTML解析器.

虽然这听起来只是一种美化的正则表达式方法,但是pyparsing提供了用于处理HTML或XML标记文本的内置函数.Pyparsing避免了许多使基于正则表达式的解决方案受挫的陷阱:

  • 接受空格而不会在表达式上乱丢'\ s*'
  • 处理标签内的意外属性
  • 以任何顺序处理属性
  • 处理标签中的大写/小写
  • 使用命名空间处理属性名称
  • 处理双引号,单引号或引号的属性值
  • 处理空标签(表单的标签<blah />)
  • 通过对标记属性的对象属性访问返回已解析的标记数据

这是一个<a href=xxx>从网页中获取标签的pyparsing wiki的简单示例:

from pyparsing import makeHTMLTags, SkipTo

# read HTML from a web page
page = urllib.urlopen( "http://www.yahoo.com" )
htmlText = page.read()
page.close()

# define pyparsing expression to search for within HTML    
anchorStart,anchorEnd = makeHTMLTags("a")
anchor = anchorStart + SkipTo(anchorEnd).setResultsName("body") + anchorEnd

for tokens,start,end in anchor.scanString(htmlText):
    print tokens.body,'->',tokens.href
Run Code Online (Sandbox Code Playgroud)

这将拉出<a>标签,即使页面的其他部分包含有问题的HTML.在pyparsing wiki中还有其他HTML示例:

Pyparsing并不是解决此问题的完全万无一失的解决方案,但通过向您展示解析过程,您可以更好地控制您特别感兴趣的HTML部分,处理它们,并跳过其余部分.


Ms2*_*ger 5

html5lib无法解析"那里"的一半

这听起来非常难以置信.html5lib使用与最近版本的Firefox,Safari和Chrome中实现的完全相同的算法.如果该算法打破了网络的一半,我想我们会听到.如果您遇到特殊问题,请提交文件错误.