首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用lxml和请求从XPath返回utf-8

使用lxml和请求从XPath返回utf-8
EN

Stack Overflow用户
提问于 2015-07-29 16:38:01
回答 1查看 1.9K关注 0票数 3

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

这一切似乎都在正常工作,但麻烦的是,当我这样做时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html_tree.xpath('//text()')[0]

这应该给我树中的第一个文本节点,我得到一个字符串,而不是unicode对象,我发现自己不得不写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html_tree.xpath('//text()')[0].decode('utf8')

,这糟透了,

我最初所做工作的全部思想是创建神话中的Unicode三明治,但是无论我做什么,我都会得到二进制字符串。我在这里错过了什么?

以下是你的概念证明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-29 17:00:44

嗯,就像经常发生的那样,我在发布了一个详细的问题后不久就找到了答案。lxml返回字节字符串的原因--即使您仔细地将它交给unicode --是因为lxml。从常见问题:

在Python 2中,lxml的API返回普通ASCII文本值的字节字符串,无论是标记名称还是元素内容中的文本。 其原因是,ASCII编码的字节字符串与Python 2中的Unicode字符串兼容,但占用的内存更少(通常是2或4倍),而且创建速度更快,因为它们不需要解码。普通的ASCII字符串值在XML中非常常见,因此这种优化通常是值得的。

然而,在Python 3中:

lxml总是返回文本和名称的Unicode字符串,ElementTree也是如此。自从Python3.3以来,Unicode字符串只包含可以用ASCII或拉丁文-1编码的字符,通常与字节字符串一样有效。在早期版本的Python 3中,上面提到的缺点也适用。

所以你就有了。这是lxml中的性能优化,增加了对字节和unicode字符串的混淆。

至少它是用Python 3修复的!该升级了。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31713444

复制
相关文章
Pycharm 修改自动格式化时每行的字数
image.png
马哥Python
2019/06/28
1K0
Pycharm 修改自动格式化时每行的字数
UITextView字数限制
经常做,经常忘,记下来,以后好直接拷贝。 开始使用如下方法做限制 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@""] && range.length > 0) { //删除字符肯定是安全的 return YES; }
王大锤
2018/07/04
2.7K0
UITextView字数限制
经常做,经常忘,记下来,以后好直接拷贝。 开始使用如下方法做限制 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@""] && range.length > 0) { //删除字符肯定是安全的 return YES; }
王大锤
2018/05/17
2.4K0
Typecho文章字数计算
炒鸡简单的,只需要在当前使用的主题的根目录的functions.php插入如下代码
折影轻梦
2021/08/11
9930
php怎么统计文章字数?
PHP中如何正确统计中文字数?PHP中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测试统计字符串的长度,看看把中文算成几个字节: echo strlen("二货ABC") . ""; # 输出 9 echo mb_strlen("二货ABC", 'UTF-8') . ""; # 输出 5 echo mb_strwidth("二货ABC") . ""; #输出 7 从上面的测试,我们可以看出:strlen 把中文字
雨尘
2018/07/17
3.2K0
统计字数oninput?keyup?onchange?
当元素的值发生改变时,会触发change事件。该事件仅适用于<input>, <select>和<textarea> 元素。当用于<select>元素时,change 事件会在选择某个选项时发生。当用于<input>或<textarea>时,该事件会在元素失去焦点时发生。
奋飛
2019/08/15
2.7K0
php怎么统计文章字数?
PHP中如何正确统计中文字数?PHP中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测试统计字符串的长度,看看把中文算成几个字节:
墨渊
2018/05/09
4.8K5
Discourse 主题字数限制
你可以在 Discourse 的后台设置中搜索 min topic title length 关键字。
HoneyMoose
2020/05/20
1.1K0
Discourse 主题字数限制
每行字符数(CPL)的起源
前几天,我收到网友小龙的Email。 他想与我讨论一个问题: "各种计算机语言的编码风格,有的建议源码每行的字符数(characters per line)不超过72个,还有的建议不超过80个,这是
ruanyf
2018/04/12
1.2K0
每行字符数(CPL)的起源
python模拟sed在每行添加##
     我们在平常的工作中有时候需要对摸一个文件进行操作,比如在一个文件的每行前面添加##之类的,在shell中这个需求很简单,用sed单行就能搞定,下面我们来看看一个文件:
py3study
2020/01/06
9210
php怎么统计文章字数?
PHP中如何正确统计中文字数?PHP中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测试统计字符串的长度,看看把中文算成几个字节: echo strlen("二货ABC") . ""; # 输出 9 echo mb_strlen("二货ABC", 'UTF-8') . ""; # 输出 5 echo mb_strwidth("二货ABC") . ""; #输出 7 从上面的测试,我们可以看出:strlen 把中文
用户1456630
2018/05/25
2.5K0
iOS lable多行取每行字符串
最近项目需要从lable的中去每行添加换行符,在网上找了一些资料,总结了一下怎么处理这个问题。
菜菜不吃蔡
2018/08/03
1.2K0
js对数字数组排序[通俗易懂]
js中经常需要用到对数组进行排序的操作,当数组中的元素均为数字时,直接使用sort()进行排序得到的结果可能不是你想要的结果。
全栈程序员站长
2022/08/28
3.4K0
Salesforce lightning datatable 每行表示Link项目
使用LightningDatatable做成的ListView时,有时需要自定义Link项目,例如需要Link式的行删除事件,当点击消除Link时,消除当前行数据,如下
repick
2022/05/20
6080
Salesforce lightning datatable 每行表示Link项目
zblogPHP文章摘要字数说明
相信很多做网站朋友都知道,在SEO方便,每个页面的关键词和描述最好都是提取文章的关键词和摘要,而有的人喜欢直接用调用文章的字数,有些人喜欢调用摘要内容的字数限制,今天就把这两种方法都交给大家,根据自己习惯去使用,因为有些网站是以图片形式发布的,但是如果以文章内容调用的话很可能是图片,所以摘要的字数显示就有用处了,教程如下:
李洋博客
2021/06/15
7550
zblogPHP文章摘要字数说明
Vue文字数组向上翻动
<template> <div class="marquee" @mouseenter="enterMar()" @mouseleave="leaveMar()"> <div :class="{ 'marquee-up': isUp }"> <p class="marquee-text" v-for="(item, index) in dataList" :key="index"> {{ item }} </p> </div> </div> <
明知山
2021/04/15
8150
读取文档数据的各列的每行中
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117322.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/06
2K0
你的每行代码值多少钱?
我知道,“line of code”(LoC)是一种非常愚蠢的计量方式。不要急着喷我,请大家先听我讲讲我最近参与的两个项目,看一下一些非常有意思的数字。
哲洛不闹
2018/09/18
1.6K0
你的每行代码值多少钱?
typecho统计博客所有文章的字数
腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云 GTS 官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧 。
小唐同学.
2023/01/06
1.4K1
Typecho文章字数统计插件WordCount
WordCount插件是一款默认编辑器增强Typecho插件,插件的功能是实时计算文章内容的文字数量、字符数量,包括文字、标点符号、英文字母、阿拉伯数字和标签。计算方式是 字数等于文字数量加数字数量;文字字数包含中文数量;字母数量等于大小写字母;数字即0-9;标签数量即文章标签的数量。
小唐同学.
2022/02/18
2.8K2
Typecho文章字数统计插件WordCount

相似问题

查找每行的字数

20

每行打印随机字数

10

统计每行的字数

18

每行字数(WPL)图像处理

10

脚本中每行的字数

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文