当前位置: 首页 > 面试题库 >

HTML编码和lxml解析

顾炎彬
2023-03-14
问题内容

我试图最终解决一些编码问题,这些问题从尝试使用lxml抓取HTML弹出。这是我遇到的三个示例HTML文档:

1。

<!DOCTYPE html>
<html lang='en'>
<head>
   <title>Unicode Chars: 은 —’</title>
   <meta charset='utf-8'>
</head>
<body></body>
</html>

2。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko-KR" lang="ko-KR">
<head>
    <title>Unicode Chars: 은 —’</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body></body>
</html>

3。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Unicode Chars: 은 —’</title>
</head>
<body></body>
</html>

我的基本脚本:

from lxml.html import fromstring
...

doc = fromstring(raw_html)
title = doc.xpath('//title/text()')[0]
print title

结果是:

Unicode Chars: ì ââ
Unicode Chars: 은 —’
Unicode Chars: 은 —’

因此,显然是样本1和缺少<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />标签的问题。这里的解决方案将正确地将示例1识别为utf-8,因此在功能上与我的原始代码等效。

lxml文档出现冲突:

从这里开始,该示例似乎建议我们应该使用UnicodeDammit将标记编码为unicode。

from BeautifulSoup import UnicodeDammit

def decode_html(html_string):
    converted = UnicodeDammit(html_string, isHTML=True)
    if not converted.unicode:
        raise UnicodeDecodeError(
            "Failed to detect encoding, tried [%s]",
            ', '.join(converted.triedEncodings))
    # print converted.originalEncoding
    return converted.unicode

root = lxml.html.fromstring(decode_html(tag_soup))

但是在这里它说:

当您尝试[解析] Unicode字符串中的HTML数据时会出错,该字符串在标头的meta标签中指定了字符集。通常应避免在将XML /
HTML数据传递到解析器之前将其转换为unicode。它既慢又容易出错。

如果我尝试遵循lxml文档中的第一个建议,那么我的代码现在是:

from lxml.html import fromstring
from bs4 import UnicodeDammit
...
dammit = UnicodeDammit(raw_html)
doc = fromstring(dammit.unicode_markup)
title = doc.xpath('//title/text()')[0]
print title

我现在得到以下结果:

Unicode Chars: 은 —’
Unicode Chars: 은 —’
ValueError: Unicode strings with encoding declaration are not supported.

现在,示例1可以正常工作,但由于<?xml version="1.0" encoding="utf-8"?>标签,示例3导致错误。

是否有处理所有这些情况的正确方法?是否有比以下更好的解决方案?

dammit = UnicodeDammit(raw_html)
try:
    doc = fromstring(dammit.unicode_markup)
except ValueError:
    doc = fromstring(raw_html)

问题答案:

lxml有一些
与处理Unicode有关的问题。最好在明确指定字符编码时使用字节(目前):

#!/usr/bin/env python
import glob
from lxml import html
from bs4 import UnicodeDammit

for filename in glob.glob('*.html'):
    with open(filename, 'rb') as file:
        content = file.read()
        doc = UnicodeDammit(content, is_html=True)

    parser = html.HTMLParser(encoding=doc.original_encoding)
    root = html.document_fromstring(content, parser=parser)
    title = root.find('.//title').text_content()
    print(title)

输出量

Unicode Chars: 은 —’
Unicode Chars: 은 —’
Unicode Chars: 은 —’


 类似资料:
  • 问题内容: 我正在尝试使用BeautifulSoup从网页中提取表格的HTML代码。 我想知道为什么下面的代码可以与一起使用,如果我更改为,则可以打印回去。 问题答案: 文档中有一个特殊的段落,称为“解析器之间的差异”,其中指出: Beautiful Soup为许多不同的解析器提供了相同的接口,但是每个解析器都是不同的。不同的解析器将从同一文档创建不同的解析树。最大的区别在于HTML解析器和XML

  • 编码是将字符,数字和其他特殊字符等字符序列放入专用格式以进行有效传输的过程。 解码是将编码格式转换回原始字符序列的过程。它与我们通常误解的加密完全不同。编码和解码用于数据通信和存储。编码不应用于传输敏感信息。 URL编码 URL只能使用ASCII字符集通过Internet发送,并且在URL包含除ASCII字符之外的特殊字符的情况下,需要对其进行编码。网址不包含空格,并替换为加号(+)或。 ASCI

  • 主要内容:URL基本组成,哪些字符需要编码,Python实现编码与解码,Python 的标准库urllib.parse模块中提供了用来编码和解码的方法,分别是 urlencode() 与 unquote() 方法。当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。 安全字符,指的是没有特殊用途或者特殊意义的字符。 URL基本组成 URL 是由一些简单的组件构成,比如协议、域名、端

  • 问题内容: 编码URL字符串以使其符合rfc2396并解码与rfc2396兼容的字符串(例如,将%20替换为空格字符)的最佳方法是什么? 编辑:URLEncoder的和URLDecoder类做 不 编码/解码RFC2396兼容网址,它们编码到一个MIME类型application / x-WWW窗体-urlencoded的其用于编码HTML表单参数数据。 问题答案: 使用URI类,如下所示: 或者

  • 本文向大家介绍Python中的html5lib和lxml解析器,包括了Python中的html5lib和lxml解析器的使用技巧和注意事项,需要的朋友参考一下 html5lib是用于解析HTML的纯Python库。它被设计为符合WHATWG HTML规范,所有主要的Web浏览器都实现了该规范。它可以解析HTML文档的几乎所有元素,将其分解为不同的标记和片段,可以针对各种用例将其过滤掉。它以与主要浏