在通过:
了解了抓取网页的一般流程之后,加上之前介绍的:
应该就很清楚如何利用工具去抓取网页,并分析源码,获得所需内容了。
下面,就来通过实际的例子来介绍,如何通过Python语言,实现这个抓取网页并提取所需内容的过程:
假设我们的需求是,从我(crifan)的Songtaste上的页面:
先抓取网页的html源码,然后再提取其中我的songtaste上面的名字:crifan
此任务,很简单。
下面就来说说,如何用Python来实现。
先去写出,如何利用Python中相关的库,获得网页的html源码的代码:#---------------------------------import---------------------------------------
import urllib2;
#------------------------------------------------------------------------------
def main():
userMainUrl = "http://www.songtaste.com/user/351979/";
req = urllib2.Request(userMainUrl);
resp = urllib2.urlopen(req);
respHtml = resp.read();
print "respHtml=",respHtml; # you should see the ouput html
###############################################################################
if __name__=="__main__":
main();
如此,你使用此python脚本,就可以获得最基本的,对应该url返回的html代码了。
此html源码,和你用浏览器打开:
然后查看网页源码后,所看到的源码是一样的。
而我们此处想要从此html中提取出:
crifan
...
中的字符串:crifan
而之前也在
中说过了,对于提取这样的内容的话,至少有两种常见方法。
一种是用正则表达式,即python中的re模块;
另一种是用Python的第三方库,BeautifulSoup,去帮助转换为soup对象,然后利用其内置函数,方便的帮我提取出需要的内容。
此处,先说第一种,用python的re来实现提取所需字符串:#---------------------------------import---------------------------------------
import urllib2;
import re;
#------------------------------------------------------------------------------
def main():
userMainUrl = "http://www.songtaste.com/user/351979/";
req = urllib2.Request(userMainUrl);
resp = urllib2.urlopen(req);
respHtml = resp.read();
print "respHtml=",respHtml; # you should see the ouput html
#
crifan
foundH1user = re.search('
(?P.+?)
', respHtml);print "foundH1user=",foundH1user;
if(foundH1user):
h1user = foundH1user.group("h1user");
print "h1user=",h1user;
###############################################################################
if __name__=="__main__":
main();
如此,就可以打印出我们所需要的字符串:crifan,了。
注意:
而关于此处,还需注意,你自己所要处理的网站的html源码所用的charset是什么,不了解的话,可参考:
去找到你自己所需处理的html的charset。
接着,再简单介绍一下,如何利用BeautifulSoup来实现提取所需字符串:
首先,需要下载对应的BeautifulSoup,此处由于Python使用的2.7版本,所以需要去
下载对应的
下载后,将BeautifulSoup-3.0.6.py改名为BeautifulSoup.py,放到你当前python脚本同目录即可。
然后使用如下脚本:songtasteHtmlEncoding = "GB2312";
soup = BeautifulSoup(respHtml, fromEncoding=songtasteHtmlEncoding);
#
crifan
foundClassH1user = soup.find(attrs={"class":"h1user"});
print "foundClassH1user=%s",foundClassH1user;
if(foundClassH1user):
h1userStr = foundClassH1user.string;
print "h1userStr=",h1userStr;
则同样也可以把所需的crifan字符串提取出来。
对应的,完整的python源码为:#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
【版本信息】
版本: v1.0
作者: crifan
【详细信息】
用于:
【教程】抓取网并网页中所需要的信息 之 Python版
https://www.crifan.com/crawl_website_html_and_extract_info_using_python/
的示例代码。
-------------------------------------------------------------------------------
"""
#---------------------------------import---------------------------------------
import urllib2;
import re;
from BeautifulSoup import BeautifulSoup;
#------------------------------------------------------------------------------
def main():
userMainUrl = "http://www.songtaste.com/user/351979/";
req = urllib2.Request(userMainUrl);
resp = urllib2.urlopen(req);
respHtml = resp.read();
#print "respHtml=",respHtml; # you should see the ouput html
print "Method 1: Use python re to extract info from html";
#
crifan
foundH1user = re.search('
(?P.+?)
', respHtml);print "foundH1user=",foundH1user;
if(foundH1user):
h1user = foundH1user.group("h1user");
print "h1user=",h1user;
print "Method 2: Use python third lib BeautifulSoup to extract info from html";
songtasteHtmlEncoding = "GB2312";
soup = BeautifulSoup(respHtml, fromEncoding=songtasteHtmlEncoding);
#
crifan
foundClassH1user = soup.find(attrs={"class":"h1user"});
print "foundClassH1user=%s",foundClassH1user;
if(foundClassH1user):
h1userStr = foundClassH1user.string;
print "h1userStr=",h1userStr;
###############################################################################
if __name__=="__main__":
main();
同理,此处之所以用GB2312的原因,参见:
顺便,也把整个代码,提供下载吧:
额外说明:
1.其中关于如何学习和使用Python中的正则表达式的话,不熟悉的可以参考:
以及其中的:
2. 和此处相关的更多代码,可以去:
看其中的代码。
3. 而前面的,用于获得网页的源码的部分,其实我已经封装了个,功能更加全面的函数:
相关的源代码:crifanLib.py,可以去这里下载:
相关帖子: