设为首页收藏本站

Crossin的编程教室

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

边学边做: 网页数据收集(xpath/yql), 并输出rss feed

[复制链接]

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2015-10-26 03:01:33 |只看该作者 |倒序浏览
最终的目标:

用python写一个网页数据收集(web scraper, with xpath), 并输出rss feed的小工具.

我的段位:

只能照猫画虎的搞一些简单的小程序, 对于任何一种语言都不熟悉. 语法什么的是白目.

自学贴, 从基础开始, 感谢crossin.
http://crossin.me/forum.php?mod=viewthread&tid=5452

本帖是我完成目标的自学摸索以及问题.
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

沙发
发表于 2015-10-26 03:01:51 |只看该作者


学习到了模块和方法, 我很感兴趣这部分. 所以就多学了一些:

如何得到目前可以用到的模块?
  1. python #进入python
  2. >>>help() #进入help模式
  3. help>modules #列出所有modules
复制代码
列出包含某个字段的modules
  1. help>modules http
复制代码
查询特定modules的帮助信息
  1. help>xml.etree
复制代码
退出help模式
  1. help>q
复制代码
退出python
  1. >>>exit()
复制代码
我完成顶楼目标的模块就是lxml, beautiful soup不支持xpath, 而且有些慢?
参考: Best Python Module for HTML parsing - Stack Overflow
http://stackoverflow.com/questio ... le-for-html-parsing

lxml.html 官方网站
http://lxml.de/lxmlhtml.html



如何安装新的module?

我想安装lxml, 看了很多网上资料很复杂, 可我尝试了下面这个语句就可以了:
  1. pip install lxml
复制代码
如何卸载module?
  1. pip uninstall lxml
复制代码
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

板凳
发表于 2015-10-26 04:56:19 |只看该作者
本帖最后由 anyone 于 2015-10-26 04:58 编辑

网页内容萃取(web scraper)+xpath

参考了:

[翻]使用requests和lxml进行web抓取
http://www.zhidaow.com/post/html-scraping

用lxml解析HTML
http://www.cnblogs.com/descusr/archive/2012/06/20/2557075.html


我自己搞了个小程序:

  1. import requests
  2. page=requests.get('http://blog.wenxuecity.com/myblog/1666/90734.html')
  3. #page.content 是网页的内容, 还有其他的, 比如page.text等, 这个要参考requests模块的说明.

  4. import chardet
  5. enc=chardet.detect(page.content)
  6. #这是个猜编码的模块, 很多地方推荐, 用法也简单. http://www.cnblogs.com/xiaowuyi/archive/2012/03/09/2387173.html
  7. #开始我总是将page.text进行侦测, 结果返回no lenth()或者not charatar file等.

  8. page.encoding=enc['encoding']
  9. #对于类似json数组的引用, 就是上面这样.

  10. #import pdb
  11. #pdb.set_trace()
  12. #这段是学习debug时候的成果 #Python 程序如何高效地调试? - 知乎 #http://www.zhihu.com/question/21572891


  13. from lxml import etree
  14. myParser=etree.HTMLParser(encoding='utf-8')
  15. tree=etree.HTML(page.content,parser=myParser)
  16. titles=tree.xpath('//span[@class="atc_title"]/a/text()')
  17. #上面参考了 #python - Parsing UTF-8/unicode strings with lxml HTML - Stack Overflow #http://stackoverflow.com/questions/11938924/parsing-utf-8-unicode-strings-with-lxml-html
  18. #但是就是输出的是乱码.


  19. from lxml import html
  20. tree=html.fromstring(page.content)
  21. titles=tree.xpath('//span[@class="atc_title"]/a/text()')
  22. #这个我是根据http://www.zhidaow.com/post/html-scraping的样例做的, 一样.

  23. print(titles)
复制代码
首战失败, 问题

如何操作encoding?
lxml.etree 和 lxml.html 有啥不同?

明日继续学习.

回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2015-10-26 13:03:47 |只看该作者
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

5#
发表于 2015-10-27 21:04:05 |只看该作者
crossin先生 发表于 2015-10-26 13:03

请问编码的问题是如何解决? 为什么我总是得到的是一堆/xxxx这样的结果呢?

源页面时utf8中文页面
我怎么才能保证在requests.get和etree.htmlparser之后编码仍然是utf8呢?

谢谢.
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2015-10-28 23:44:53 |只看该作者
你要把结果print出来就可以了。如果是在list中,是不会去解码的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

7#
发表于 2015-12-15 23:22:57 |只看该作者
本帖最后由 anyone 于 2015-12-15 23:24 编辑

前一段比较忙, 现在我开始继续这个事情.  下面是我自己学习的代码, 目前可以使用re来返回我需要的一些页面内容.
  1. import urllib
  2. import re


  3. urls = ["http://www.google.com","http://www.yahoo.com", "http://www.sina.com.cn", "http://www.bbc.co.uk"]


  4. i=0
  5. while i<len(urls):

  6.         htmlfile = urllib.urlopen(urls[i])
  7.         htmltext = htmlfile.read()

  8.         regex = "<title>(.*?)</title>"
  9.         pattern = re.compile(regex)

  10.         needle = re.findall(pattern, htmltext)

  11.         # have to use, to add string?
  12.         # how to deal with chinese charactars?
  13.         print urls[i]," title is: ",needle
  14.         i+=1
复制代码
但是问题仍然是,

1, 我如何print出来中文呢?
2, 在print中为什么连接url和string中间使用逗号","?

烦请crossin帮我解答一下, 谢谢.
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2015-12-15 23:31:18 |只看该作者
anyone 发表于 2015-12-15 23:22
前一段比较忙, 现在我开始继续这个事情.  下面是我自己学习的代码, 目前可以使用re来返回我需要的一些页面 ...

needle是个list,要print出中文,需要对其中的每一项输出,而不是直接作为整体输出。
逗号只是为了在同一行输出,也可以用两个print,那样会换行
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

9#
发表于 2015-12-15 23:47:20 |只看该作者
needle是个list,要print出中文,需要对其中的每一项输出,而不是直接作为整体输出。


非常感谢, 我换成needle[0]就可以了. 原来我对于变量类型太不熟悉, 我会专门的看看你的这方面课程.

逗号只是为了在同一行输出,也可以用两个print,那样会换行


这里的逗号是一个什么操作符号呢? 在你的课程里面哪项是介绍这部分内容的呢?


非常感谢你的快速回复.
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2015-12-16 10:43:05 |只看该作者
anyone 发表于 2015-12-15 23:47
非常感谢, 我换成needle[0]就可以了. 原来我对于变量类型太不熟悉, 我会专门的看看你的这方面课程.

这是 print 命令的一个小用法
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-4-28 06:19 , Processed in 0.020407 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部