全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 3028|回复: 25
打印 上一主题 下一主题

PYTHON 获取GB2312的问题

[复制链接]
跳转到指定楼层
1#
发表于 2015-12-3 08:43:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了lxml的etree定位的。

然后编码问题到现在都是一个非常蛋疼的问题。我获取了一个标题,然后直接打印出来是乱码的。

在后面encode('utf8') 显示的是UTF8不能编码这玩意。
encod gb2312也是

球袋
2#
发表于 2015-12-3 08:47:30 | 只看该作者
嘿嘿   你没看懂python的编解码

python的编码转换需要decode成unicode 再encode,也就是说encode函数只能用于unicode

举例,获取的编码是gbk,需要转化成utf-8
getstr.decode('gbk').encode('utf8')
3#
 楼主| 发表于 2015-12-3 08:49:08 | 只看该作者
jsenet 发表于 2015-12-3 08:47
嘿嘿   你没看懂python的编解码

python的编码转换需要decode成unicode 再encode,也就是说encode函数只能用 ...

- -这个早就试过了。不晓得如何也是出错了。
4#
发表于 2015-12-3 08:50:48 | 只看该作者
本帖最后由 jsenet 于 2015-12-3 08:52 编辑
flydon 发表于 2015-12-3 08:49
- -这个早就试过了。不晓得如何也是出错了。


不可能  只要是unicode的就能进行encode

mystr=u'你是大笨蛋'
mystr.encode('utf8')

还有 页面定义编码、文件存储编码、和你encode后的要一致,否则 输出乱码
5#
发表于 2015-12-3 09:02:39 | 只看该作者
你需要这样
getstr.decode('gbk','ignore').encode('utf8')

忽略下,有的不标准
6#
 楼主| 发表于 2015-12-3 09:06:42 | 只看该作者
jsenet 发表于 2015-12-3 08:50
不可能  只要是unicode的就能进行encode

mystr=u'你是大笨蛋'

这样肯定OK。网络上的教程都这么写。。但是和实际情况差别很大。
7#
 楼主| 发表于 2015-12-3 09:11:54 | 只看该作者
HelloAoA 发表于 2015-12-3 09:02
你需要这样
getstr.decode('gbk','ignore').encode('utf8')


代码如下。。出现的还是乱码。

  1. # -*- encoding:utf-8 -*-
  2. __author__ = 'Administrator'
  3. from lxml import etree
  4. import requests,sys
  5. reload(sys)
  6. sys.setdefaultencoding( "utf-8" )


  7. # HTML FILE LIKE BELOW
  8. #     <!DOCTYPE html>
  9. # <html lang="en">
  10. # <head>
  11. #     <meta charset="gb2312">
  12. #     <title></title>
  13. # </head>
  14. # <body>
  15. # <p>测试中文了。。。。。。</p>
  16. #
  17. # </body>
  18. # </html>
  19. #


  20. url='http://192.168.0.166/'
  21. header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
  22. index = requests.get(url,headers = header)

  23. selector = etree.HTML(index.text)


  24. xpath_code='/html/body/p/text()'

  25. test_html = selector.xpath(xpath_code)

  26. print test_html[0].decode('gbk','ignore').encode('utf8')
复制代码
8#
发表于 2015-12-3 09:19:26 | 只看该作者
flydon 发表于 2015-12-3 09:11
代码如下。。出现的还是乱码。

1.你的ssh (putty)是否选择了utf-8
2.该py保存文件格式是否选了utf-8

3.gbk的话不需要ignore    gb2312才需要
9#
发表于 2015-12-3 09:21:14 | 只看该作者
编码问题不要瞎尝试,要找到问题所在,知道自己的每次转换是在干什么

最主要的三统一:页面声明 程序文件保存 str   这3个编码保持一致就不会乱码
10#
发表于 2015-12-3 09:28:40 | 只看该作者
flydon 发表于 2015-12-3 09:11
代码如下。。出现的还是乱码。

pydev测试通过,原来写的……还有192.。。。这货还要自己搞……有些编码器不支持中文,还有bs4的能够直接识别编码很快的,bs4后面的解码器lxml可以换的,lxml很费资源

  1. #coding=utf-8
  2. '''
  3. Created on 2015年12月3日

  4. @FileName: Test.py

  5. @Description: (描述)

  6. @Site:  http://www.sugarguo.com/

  7. @author: 'Sugarguo'

  8. @version V1.0.0
  9. '''


  10. import sys
  11. reload(sys)
  12. sys.path.append("..")
  13. sys.setdefaultencoding('utf8')

  14. import requests
  15. from lxml import etree
  16. from bs4 import BeautifulSoup

  17. headers = {
  18.            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  19.            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  20.            #'Accept-Encoding': 'gzip, deflate',
  21.            'Connection': 'close',
  22.         }

  23. def getHtmlWithoutProxy(url):
  24.     try:
  25.         headers['User-Agent'] = {"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"}
  26.         r = requests.get(url, headers=headers, timeout=5)
  27.         print 'Encoding: ',r.encoding
  28.         print 'Get Url :',url
  29.         print 'Status Code: ',r.status_code
  30.         html = r.content
  31.         return html
  32.     except Exception as e:
  33.         print(e)
  34.         print "**********[ Error! ]**********\n"

  35. content_html = getHtmlWithoutProxy('http://www.biquge.la/book/176/5054609.html')

  36. soup = BeautifulSoup(content_html,"lxml")

  37. print soup.find(id="content").get_text()


  38. list_html = getHtmlWithoutProxy('http://www.biquge.la/book/176').lower().decode('gb2312')
  39. list_page = etree.HTML(list_html)

  40. novelTitle = list_page.xpath(u'//div[@id="list"]/dl/dd/a/text()')

  41. for item in novelTitle:
  42.     print item
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-9-28 04:18 , Processed in 0.076358 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表