Crossin的编程教室

标题: 萃取页面内容遇到的问题, 请crossin帮忙 [打印本页]

作者: anyone    时间: 2016-5-4 18:30
标题: 萃取页面内容遇到的问题, 请crossin帮忙
本帖最后由 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 '---'

复制代码

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

非常感谢.
作者: crossin先生    时间: 2016-5-4 22:34
anyone 发表于 2016-5-4 18:44
补充一个问题, 如果我在windows下执行这个文件:结果全是乱码? 不知如何做到在不同的环境中都可以显示中文字 ...

windows默认控制台是cp936编码。要保证显示中文,得用相同的编码输出
作者: crossin先生    时间: 2016-5-4 22:36
这个你要通过调试来寻找问题原因。把中间变量打印出来,看跟预期是否相符,比如baseHtml也许就已经和页面不一致了。有些网页在页面上是通过js异步加载的
作者: anyone    时间: 2016-5-5 22:51
标题: 萃取页面时候遇到的编码问题, 请教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, 能帮助我一下吗?

作者: crossin先生    时间: 2016-5-6 11:10
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先生    时间: 2016-5-6 11:12
anyone 发表于 2016-5-5 22:51
以上是我简单的一个截取一篇新浪新闻正文的例子, 我多方调试, 得到的都是乱码, 看了你的http://chuansong.m ...

将你的两个提问帖合并了一下
作者: anyone    时间: 2016-5-6 19:23
非常感谢, 我发现是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. 这样就解决了问题.




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5