【问题标题】:How do I check if a page is html5-based in python?如何在 python 中检查页面是否基于 html5?
【发布时间】:2013-05-07 02:20:33
【问题描述】:

我正在尝试使用lxml 模块解析网络上的各种页面,例如:

def dom(self):
    return lxml.html.fromstring(self.content)

但对于 html5 页面,我似乎必须将此 lxml.html 切换为 lxml.html.html5parser

http://lxml.de/html5parser.html

那么如何确定一个页面是否基于 html5?我必须在解析之前逐个检查DOCTYPE char 吗?


编辑:我做了一个简单的正则表达式来处理这个问题。它似乎有效,但是,是的,我仍在寻找一些巧妙的方法。这个解决方案打破了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))

【问题讨论】:

    标签: python html lxml


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,但我发现用lxml.html 解析html5文件会出现一堆乱码。
    • @ernix,这与 Alohci 的回答相反。让我重复一下 Alohci 的回答:你应该对非 html5 文件也使用 html5parser,而不是像你说的那样在 html5 上使用 lxml.html。
    • @krawyoti,谢谢。但 html5 与旧 html 不兼容。标签名称必须是小写的 html5。在html5lib 版本“1.0b2”中,我可以看到html5lib/inputstream.py: EncodingParser.getEncoding 解析&lt;meta&gt;,但不能正确解析&lt;META&gt;
    • @ernix - HTML5 的 text/html 序列化中的标记名称不区分大小写。 (它们用于 application/xhtml+xml 序列化,但元元素中的字符集定义无论如何都会被忽略)。 inputstream.py 中&lt;meta 的处理只是输入HTML 的初始预扫描的一部分。该字符集可以稍后在 html5parser.py 的 startTagMeta 中更新。通过 tokenizer.py 中的 emitCurrentToken 进行比较,标记名称是小写的。
    • @ernix - 我不得不说 inputstream.py 看起来确实有问题。 HTML5 parser algorithm for the prescan 确实说它应该匹配“元”ASCII 大小写不敏感。
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 2021-04-18
    • 2022-12-16
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多