您的位置:首页 > 编程语言 > Python开发

python 解析网页数据的几种方法简介

2012-10-17 13:24 876 查看
工作中经常与数据打交道,去网上抓取数据也成了家常便饭。以前就准备抽空总结下的。

最近刚好看到 http://segmentfault.com/q/1010000000124036 上这篇文章有人问到了,

而且下面有热心pythoner 已经回答了,特此整理下,以备忘。

问题:现在要抓取一批页面,并将指定标签里面的数据抓取出来,如何做到通用性好,稳定可用?

1、使用第三方库:mechanize

01
import
mechanize
02
import
cookielib
03
if
__name__
=
=
'__main__'
:
04
br
=
mechanize.Browser()
05
br.set_cookiejar(cookielib.LWPCookieJar())
#
Cookie jar
06
 
07
br.set_handle_equiv(
True
)
#
Browser Option
08
br.set_handle_gzip(
True
)
09
br.set_handle_redirect(
True
)
10
br.set_handle_referer(
True
)
11
br.set_handle_robots(
False
)
12
 
13
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),
max_time
=
1
)
14
 
15
br.addheaders
=
[(
'User-agent'
,
'Mozilla/5.0
(X11; U; Linux i686; en-US; rv:1.9.0.1)Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1'
)]
16
br.
open
(
"http://apple.com"
)
17
print
br.title()
输出为Apple

对于mechanize的详细使用,参考 http://my.oschina.net/leejun2005/blog/83451

2、使用第三方库: Beautiful
Soup 扩展包来解析

1
import
urllib
2
from
bs4
import
BeautifulSoup
3
content
=
urllib.urlopen(
'http://www.apple.com/'
).read()
4
soup
=
BeautifulSoup(content)
5
print
soup.find(
'title'
).string
输出为Apple

对于Beautiful Soup的详细使用,参考 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#quick-start

3、使用第三方库: lxml扩展包来解析

1
from
lxml
import
html
2
doc
=
html.parse(
'http://www.apple.com/'
)
3
title
=
doc.find(
'.//title'
).text
4
print
title
4、直接使用正则来解析:

1
import
urllib
2
import
re
3
url
=
'http://apple.com'
4
html
=
urllib.urlopen(url).read()
5
m
=
re.findall(r
"<title>(.*)</title>"
,
html)
6
print
m[
0
]
输出为Apple

有关python正则的使用请见《Python正则表达式操作指南》

http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97

注:

以上几种方法中,推荐优先使用前 3 种,或者有其它优秀的第三方库你也可以尝试。

之所以不推荐最后的正则解析原因有2:

(1)HTML存在一些标签不规范的场景,如<p>,<BR>,
等可以单独出现,不用配对出现,

你可以简单的认为他的语法非常灵活,不像 xml 那样限制的很严格,之所以浏览器能解析是因为

浏览器背后做了许多不为人知的解析工作,如果你要用正则来做,你也需要考虑很多情况,

而且通用性也会大打折扣。这也是建议你选择第三方库的主要原因。

(2)直接用正则这么解析,在面对复杂的抓取的时候,正则的性能会是严重的瓶颈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息