lxml 解析字符处理规则

规则1:无论输入的字符串是何种状态,lxml包接收后一律转换成unicode,其处理结果也是unicodetype,输出到文件时,需要指定编码,转换成特定的stringtype状态.
规则2:lxml用xpath解析时,如果网页文件申明的编码,与实际传递给lxml的编码不一致,将产生问题.
情形1,网页编码gb2312,传递给lxml处理,ok
情形2,网页编码gb2312,转换成unicode后,传递给lxml,ok
情形3,网页编码gb2312,转换成utf-8后,传递给lxml,不能工作.
此时需要在转换成utf-8后,也将网页文件的编码声明转换成utf-8.
lxml的工作原理:
没有编码声明时,默认是utf-8格式,lxml将用utf-8格式对传入的字符串解码成unicode;
有编码声明时,如果编码声明的stringtype和实际传入的stringtype编码格式不一致,将不工作.

document_fromstring方法将文件转换成一棵树html元素,,这个元素里面的东西是按照unicode的方式被包裹的,不能对它的结果使用encode方法.
lxml.html.tostring(x, pretty_print=True, encoding='utf-8')将按照编码参数,将html元素转换成string,注意结果是stringtype类型.
text_content(),输出结果是,可以encode,写入文件,或者在终端显示.

乱码问题:

处理源文件的时候,由于没有指定编码,所以它使用了一个默认编码,从而导致和UTF-8冲突,产生乱码。

etree.HTML有一个参数是parser,这个参数不是必须的,因此省略以后它就会自动使用一个默认的parser。可以手动指定一个:

etree.HTML(r, parser=etree.HTMLParser(encoding='utf-8'))

这里指定了etree.HTMLParser来作为一个parser,同时,etree.HTMLParser可以接受编码作为参数。于是指定为UTF-8。

原文地址:https://www.cnblogs.com/kidl/p/9329319.html