设为首页收藏本站

Crossin的编程教室

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

萃取页面内容遇到的问题, 请crossin帮忙

[复制链接]

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2016-5-4 18:30:03 |只看该作者 |倒序浏览
本帖最后由 anyone 于 2016-5-4 18:37 编辑

我尝试用lxml和xpath取得页面内容,

可是取得的结果和http://xiaohua.zol.com.cn上显示的完全不同?
而且我取得的只有8个组(笑话名称和内容), 可是页面上有20个组.
不知什么原因呢?


注: 我是打算取http://xiaohua.zol.com.cn页面右侧"网友推荐笑话"的列表以及对应的连接.

  1. import urllib2
  2. from lxml import etree

  3. #base page

  4. baseUrl="http://xiaohua.zol.com.cn"

  5. #get pages links

  6. baseHtml=urllib2.urlopen(baseUrl).read()
  7. selector=etree.HTML(baseHtml)
  8. links=selector.xpath('//ul[@class="rank-list recommend-list"]//a/@href')
  9. titles=selector.xpath('//ul[@class="rank-list recommend-list"]//a/@title')


  10. # read content

  11. for i in range(len(links)):
  12.     detailLink=baseUrl+links[i]
  13.     contentHtml=urllib2.urlopen(detailLink).read()
  14.     selector=etree.HTML(contentHtml)
  15.     content=selector.xpath('normalize-space(//div[@class="article-text"]/text())')
  16.     print titles[i].encode('utf-8')
  17.     print content.encode('utf-8')
  18.     print '---'

复制代码
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

沙发
发表于 2016-5-4 18:44:24 |只看该作者
补充一个问题, 如果我在windows下执行这个文件:
  1. python folder_filename.py
复制代码
结果全是乱码? 不知如何做到在不同的环境中都可以显示中文字呢?

非常感谢.
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2016-5-4 22:34:36 |只看该作者
anyone 发表于 2016-5-4 18:44
补充一个问题, 如果我在windows下执行这个文件:结果全是乱码? 不知如何做到在不同的环境中都可以显示中文字 ...

windows默认控制台是cp936编码。要保证显示中文,得用相同的编码输出
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2016-5-4 22:36:20 |只看该作者
这个你要通过调试来寻找问题原因。把中间变量打印出来,看跟预期是否相符,比如baseHtml也许就已经和页面不一致了。有些网页在页面上是通过js异步加载的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

5#
发表于 2016-5-5 22:51:06 |只看该作者

萃取页面时候遇到的编码问题, 请教crossincode

  1. import urllib2
  2. from lxml import etree


  3. html=urllib2.urlopen("http://news.sina.com.cn/c/nd/2016-05-05/doc-ifxryhhi8393376.shtml").read()
  4. selector=etree.HTML(html)
  5. get=selector.xpath("//div[@id='artibody']//text()[normalize-space(.)]")

  6. out='\n'.join(get)
  7. print out.encode('utf-8')
复制代码
以上是我简单的一个截取一篇新浪新闻正文的例子, 我多方调试, 得到的都是乱码, 看了你的http://chuansong.me/n/1925964, 也尝试了一些方法, 无奈对于编码实在是没有头绪.

我测试get是一个list, 里面是类似下面的一些代码
  1. [u'\xe3\x80\x80\xe3\x80\x80[\xe5\xaf\xbc\xe8\xaf\xbb]', u'\xe3\x80\x80\xe3\x80\x80\xe2\x80\x9c\xe4\xba\x94
复制代码
奇怪的是中间有一些]'的符号, 这代表list里面还有list?

当我将这个list用join结合后, 得到的out是一个unicode, 可当我用out.encode输出后, 就全是乱码了.

我不知道错误处在哪里? crossin, 能帮助我一下吗?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2016-5-6 11:10:04 |只看该作者
get这个结果有问题,\x开头的这些编码是已经编码过的,不应该前面还有u'而成为unicode。如果要解决,可以强行用latin-1编码做一个转换,目的是为了在不做编码的情况下转成str。
字符里面的[]真的只是中括号符号。
给你段参考代码:
  1. get = [u'\xe3\x80\x80\xe3\x80\x80[\xe5\xaf\xbc\xe8\xaf\xbb]', u'\xe3\x80\x80\xe3\x80\x80\xe2\x80\x9c\xe4\xba\x94']
  2. for g in get:
  3.     print g.encode('latin-1')
复制代码
结果:

  [导读]
  “五


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2016-5-6 11:12:32 |只看该作者
anyone 发表于 2016-5-5 22:51
以上是我简单的一个截取一篇新浪新闻正文的例子, 我多方调试, 得到的都是乱码, 看了你的http://chuansong.m ...

将你的两个提问帖合并了一下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

8#
发表于 2016-5-6 19:23:10 |只看该作者
非常感谢, 我发现是sina页面服务端没有输出编码字头, 所以在默认情况下, python使用str>unicode的方式读取页面, 但是其实sina页面是按照utf-8编码的.

所以我将:
  1. html=urllib2.urlopen("http://news.sina.com.cn/c/nd/2016-05-05/doc-ifxryhhi8393376.shtml").read()
复制代码
变为:
  1. html=urllib2.urlopen("http://news.sina.com.cn/c/nd/2016-05-05/doc-ifxryhhi8393376.shtml").read().encoding('utf-8')
复制代码
指明被读取的页面的编码是utf-8. 这样就解决了问题.
回复

使用道具 举报

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

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

GMT+8, 2024-6-16 03:00 , Processed in 0.025169 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部