gpt4 book ai didi

xpath - 使用 lxml 和 requests 从 XPath 返回 utf-8

转载 作者:行者123 更新时间:2023-12-02 19:43:08 24 4
gpt4 key购买 nike

我试图弄清楚我是否正确使用了 lxml 的 xpath 函数。这是我当前的代码,包括我们在一个相当大的抓取库中慢慢积累的所有解决方法,该库处理可怕的、可怕输入:

import certifi, requests
from lxml import html
s = requests.session()
r = s.get(
url,
verify=certifi.where(),
**request_dict
)

# Throw an error if a bad status code is returned.
r.raise_for_status()

# If the encoding is iso-8859-1, switch it to cp1252 (a superset)
if r.encoding == 'ISO-8859-1':
r.encoding = 'cp1252'

# Grab the content
text = r.text
html_tree = html.fromstring(text)

因此,如果这一切正常工作,requests 使用 r.encoding 来决定在调用 r.text 时如何创建 unicode 对象。伟大的。我们获取该 unicode 对象 (text),并将其发送到 ltml.html.fromstring(),它识别出它是 unicode,并返回一个 ElementTree .

一切似乎都工作正常,但令人不安的是,当我这样做时:

html_tree.xpath('//text()')[0]

这应该给我树中的第一个文本节点,我返回一个字符串,而不是 unicode 对象,并且我发现自己必须写:

html_tree.xpath('//text()')[0].decode('utf8')

这太糟糕了。

我一开始所做的所有工作的整体想法是创建 Mythical Unicode Sandwich ,但无论我做什么,我都会返回二进制字符串。我在这里缺少什么?

<小时/>

这是为您提供的概念证明:

import certifi, requests
from lxml import html
s = requests.session()
r = s.get('https://www.google.com', verify=certifi.where())
print type(r.text) # <type 'unicode'>, GREAT!
html_tree = html.fromstring(r.text)
first_node = html_tree.xpath('//text()', smart_strings=False)[0]
print type(first_node) # <type 'str'>, TERRIBLE!

最佳答案

嗯,正如经常发生的那样,我在发布一个长而详细的问题后不久就找到了答案。即使您小心地给它 unicode,lxml 也会返回字节字符串,原因是 a performance optimization in lxml 。来自常见问题解答:

In Python 2, lxml's API returns byte strings for plain ASCII text values, be it for tag names or text in Element content.

The reasoning is that ASCII encoded byte strings are compatible with Unicode strings in Python 2, but consume less memory (usually by a factor of 2 or 4) and are faster to create because they do not require decoding. Plain ASCII string values are very common in XML, so this optimisation is generally worth it.

但是在 Python 3 中:

lxml always returns Unicode strings for text and names, as does ElementTree. Since Python 3.3, Unicode strings containing only characters that can be encoded in ASCII or Latin-1 are generally as efficient as byte strings. In older versions of Python 3, the above mentioned drawbacks apply.

所以你已经得到它了。这是 lxml 中的性能优化,增加了字节和 unicode 字符串的困惑。

至少它在 Python 3 中得到了修复!是时候升级了。

关于xpath - 使用 lxml 和 requests 从 XPath 返回 utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com