Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中检查页面是否基于html5?_Python_Html_Lxml - Fatal编程技术网

如何在python中检查页面是否基于html5?

如何在python中检查页面是否基于html5?,python,html,lxml,Python,Html,Lxml,我尝试使用lxml模块解析web上的各种页面,如: def dom(self): return lxml.html.fromstring(self.content) 但是对于html5页面,我似乎必须将这个lxml.html切换到lxml.html.html5parser 那么,如何确定页面是否基于html5呢?在解析之前,是否必须逐个字符检查DOCTYPE 编辑:我制作了一个简单的regexp来处理这个问题。这似乎很管用,但我仍在寻找一些巧妙的方法。此解决方案中断了sourcel

我尝试使用
lxml
模块解析web上的各种页面,如:

def dom(self):
    return lxml.html.fromstring(self.content)
但是对于html5页面,我似乎必须将这个
lxml.html
切换到
lxml.html.html5parser

那么,如何确定页面是否基于html5呢?在解析之前,是否必须逐个字符检查
DOCTYPE


编辑:我制作了一个简单的regexp来处理这个问题。这似乎很管用,但我仍在寻找一些巧妙的方法。此解决方案中断了
sourceline
方法

import lxml.html
from lxml.html import html5parser

def dom(self):
    content = self.content
    if self._is_html5():
        elm = html5parser.fromstring(content)
        content = lxml.html.tostring(elm, method='html')
    return lxml.html.fromstring(content)

def _is_html5(self):
    return bool(re.match(r'^<!doctype html>', self.content, re.I))
import lxml.html
从lxml.html导入HTML5解析器
def dom(self):
content=self.content
如果self.\u是\u html5():
elm=html5parser.fromstring(内容)
content=lxml.html.tostring(elm,method='html')
返回lxml.html.fromstring(内容)
def_是html5(self):
返回bool(关于匹配(r'^',self.content,关于I))

您不必切换到仅对HTML5文件使用HTML5解析器。您可以而且可能应该对所有HTML文件使用HTML5解析器。浏览器总是对所有HTML文件使用与HTML5兼容的解析器,无论其版本如何

谢谢您的回复,但我发现用
lxml.html
解析html5文件会产生一堆乱码。@ernix,这与Alohci的回答相反。让我重复一下Alohci的答案:你应该对非html5文件也使用html5解析器,而不是像你说的那样,在html5上也使用lxml.html。@krawyoti,谢谢。但是html5与旧的html不兼容。使用html5时,标记名必须是小写的。在
html5lib
version“1.0b2”中,我可以看到
html5lib/inputstream.py:EncodingParser。getEncoding
解析
,但不正确解析
。@HTML5文本/html序列化中的ernix-标记名不区分大小写。(它们用于application/xhtml+xml序列化,但无论如何都会忽略meta元素中的字符集定义)。
@ernix的处理-我不得不说,尽管inputstream.py看起来确实有漏洞。但它确实说它应该不敏感地匹配“meta”ASCII大小写。