设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 10791|回复: 8
打印 上一主题 下一主题

print输出时候的一些奇怪现象.

[复制链接]

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2016-6-19 18:26:17 |只看该作者 |倒序浏览
本帖最后由 anyone 于 2016-6-19 18:28 编辑

我编了个练习代码, 用来取http://www.xiaohuayoumo.com网站的右下角的"今日热点"

  1. import requests
  2. from lxml import html

  3. url='http://www.xiaohuayoumo.com/'
  4. dict_headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36'}


  5. # get list_links

  6. page=requests.get(url, headers=dict_headers)
  7. tree=html.fromstring(page.content)
  8. list_links=tree.xpath("//div[@class='front-top-box front-top-box-2 front-top-box-right']//a/@href")


  9. # get content for each list_links

  10. for i in list_links:
  11.     i='http://www.xiaohuayoumo.com'+i
  12.     page=requests.get(i, headers=dict_headers)
  13.     tree=html.fromstring(page.content)
  14.     title=''.join(tree.xpath("//h1[@class='page-title']/text()")).strip()
  15.     content=''.join(tree.xpath("//div[@property='content:encoded']//text()[normalize-space(.)]"))

  16.     # # 1st not show all of the articals in sublime <<<<<<<<<<<<<<<<<<<<<<<<<<
  17.     # print '\n\n'+title.encode('utf-8')
  18.     # print i
  19.     # print content.encode('utf-8')


  20.     # # 2nd coding error in window output <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  21.     # print '\n\n'+title.encode('cp936')
  22.     # print i
  23.     # print content.encode('cp936')
复制代码
注释的两个地方分别是两种方法输出,

第一是直接在sublime的输出中输出, 但是他会忽略一些输出, 本来一共是10则, 但只得到4则. 在查看丢失的文章的标题, 是由len()数目的, 但是就是无法上屏. 也没有任何错误提示.

第二是我尝试用windows terminal屏幕输出, 但是会碰到一个如下的错误提示, 我以前从来么有遇到过:
  1. UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 691:
  2. illegal multibyte sequence
复制代码
请问crossin, 这两个情况是什么原因? 该如何解决呢?
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

沙发
发表于 2016-6-19 22:31:29 |只看该作者
补充一下, 我最后不使用屏幕输出, 而用文件写入:
  1. with open ('desktop\testing.txt', 'a') as f:
  2.     f.write '\n\n'+title.encode('utf-8')
  3.     f.write i
  4.     f.write content.encode('utf-8')
复制代码
这个生成的texting.txt文件就没有问题. 不知何解?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2016-6-20 14:00:59 |只看该作者
anyone 发表于 2016-6-19 22:31
补充一下, 我最后不使用屏幕输出, 而用文件写入:这个生成的texting.txt文件就没有问题. 不知何解? ...

估计你拿下来的数据是utf8编码,你在encode之前,应该先要decode成unicode
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2016-6-20 14:02:28 |只看该作者
输出会少我不知道,你把中间数据输出然后调试看内容到底有什么问题,是不是第二次没有请求到内容
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

5#
发表于 2016-6-20 16:02:50 |只看该作者
crossin先生 发表于 2016-6-20 14:02
输出会少我不知道,你把中间数据输出然后调试看内容到底有什么问题,是不是第二次没有请求到内容 ...

我想是取到了, 因为:

1, 我用len()测试每次递归反馈的标题长度, 那些没有显示出来的标题是有len()长度的.
2, 我换用write(), 将取到的数据写到文本中, 就是完整的.

所以我想可能是你提到的decode的问题. 我从这方面入手试试.

如果可以的话, 请问如何使用requests自定义decode的编码呢? 是在get的时候定义, 还是定义get().content呢?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2016-6-21 11:27:54 |只看该作者
anyone 发表于 2016-6-20 16:02
我想是取到了, 因为:

1, 我用len()测试每次递归反馈的标题长度, 那些没有显示出来的标题是有len()长度的 ...

这个应该和request无关,应该你取出content之后,对content的编码做处理时候的问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

7#
发表于 2016-7-2 23:41:20 |只看该作者
crossin先生 发表于 2016-6-21 11:27
这个应该和request无关,应该你取出content之后,对content的编码做处理时候的问题 ...

根据我自己的排查, 这个估计是sublime的bag.
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

8#
发表于 2016-7-14 11:24:55 |只看该作者

老师,我已经解决了。我用的Sublime Text软件直接修改了EXECw...

本帖最后由 hb25 于 2016-7-14 11:35 编辑
crossin先生 发表于 2016-6-20 14:00
估计你拿下来的数据是utf8编码,你在encode之前,应该先要decode成unicode

偶像你好,我从昨天才开始跟着你的自学课程学习,因为用的是Mac所以有许多不方便,但都在网上找到办法解决了。现在就是在输入中文这个问题上又卡住了,我现在更新了ActiveTcl后可以在IDLE里输入中文,但是运行的时候会提示 "Unsupported characters in input",我在网上查了说是需要将其更改为 'utf-8' 编码才能支持输入中文。但我尝试了很久都不知道怎么使 IDLE 在交互模式下使用的编码更改为 'utf-8',根据网上的方法但是我没法编辑‘exec’文件。请问偶像老师能帮帮忙吗?谢谢
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2016-7-15 00:09:51 |只看该作者
hb25 发表于 2016-7-14 11:24
偶像你好,我从昨天才开始跟着你的自学课程学习,因为用的是Mac所以有许多不方便,但都在网上找到办法解决 ...

这个我也没研究过,之前也有人mac下的IDLE出现诡异问题无法解决。建议你要改用pycharm或者sublime text吧,比idle好用

另外呢,其实我建议刚入门的时候先回避用中文,会有很多问题影响你的学习。倒不如先放一放,把语法什么搞清楚,可以写代码了,再折腾字符编码的问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-9 03:46 , Processed in 0.020608 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部