Python使用Beautiful Soup包编写爬虫时的一些关键点


Posted in Python onJanuary 20, 2016

1.善于利用soup节点的parent属性

比如对于已经得到了如下html代码:

<td style="padding-left:0" width="60%"><label>November</label>
<input type="Hidden" id="cboMonth1" name="cboMonth1" value="11">
</td><td style="padding-right:0;" width="40%">
  <label>2012</label>
  <input type="Hidden" id="cboYear1" name="cboYear1" value="2012">
</td>

的soup变量eachMonthHeader了。

想要提取其中的

Month的label的值:November

和Year的label的值:2012

最简单,也是最省事的办法是,直接搜两个label,然后肯定会找到这两个label,然后分别对应着Month和Year的label,然后获得对应的string即可:

foundTwoLabel = eachMonthHeader.findAll("label");
print "foundTwoLabel=",foundTwoLabel;
monthLabel = foundTwoLabel[0];
yearLabel = foundTwoLabel[1];
 
monthStr = monthLabel.string;
yearStr = yearLabel.string;
 
print "monthStr=",monthStr; # monthStr= November
print "yearStr=",yearStr; # yearStr= 2012

但是很明显,这样的逻辑性很不好,而且万一处理多个这样的soup变量,而且两者的顺便颠倒了,那么结果也就错误了。

此时,可以考虑利用soup变量的parent属性,从一个soup变量本身,获得其上一级的soup变量。
示例代码如下:

# <td style="padding-left:0" width="60%"><label>November</label>
# <input type="Hidden" id="cboMonth1" name="cboMonth1" value="11">
# </td><td style="padding-right:0;" width="40%">
  # <label>2012</label>
  # <input type="Hidden" id="cboYear1" name="cboYear1" value="2012">
# </td>
foundCboMonth = eachMonthHeader.find("input", {"id":re.compile("cboMonth\d+")});
#print "foundCboMonth=",foundCboMonth;
tdMonth = foundCboMonth.parent;
#print "tdMonth=",tdMonth;
tdMonthLabel = tdMonth.label;
#print "tdMonthLabel=",tdMonthLabel;
monthStr = tdMonthLabel.string;
print "monthStr=",monthStr;
 
foundCboYear = eachMonthHeader.find("input", {"id":re.compile("cboYear\d+")});
#print "foundCboYear=",foundCboYear;
tdYear = foundCboYear.parent;
#print "tdYear=",tdYear;
tdYearLabel = tdYear.label;
#print "tdYearLabel=",tdYearLabel;
yearStr = tdYearLabel.string;
print "yearStr=",yearStr;

我们再来看一个例子:

from BeautifulSoup import BeautifulSoup 
doc = ['<html><head><title>Page title</title></head>',
    '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
    '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
    '</html>']
soup = BeautifulSoup(''.join(doc))

print soup.prettify()
# <html>
# <head>
#  <title>
#  Page title
#  </title>
# </head>
# <body>
#  <p id="firstpara" align="center">
#  This is paragraph
#  <b>
#   one
#  </b>
#  .
#  </p>
#  <p id="secondpara" align="blah">
#  This is paragraph
#  <b>
#   two
#  </b>
#  .
#  </p>
# </body>
# </html>

这个例子中,<HEAD> Tag的parent是<HTML> Tag. <HTML> Tag 的parent是BeautifulSoup 剖析对象自己。 剖析对象的parent是None. 利用parent,你可以向前遍历剖析树。

soup.head.parent.name
# u'html'
soup.head.parent.parent.__class__.__name__
# 'BeautifulSoup'
soup.parent == None
# True

2.当解析非UTF-8或ASCII编码类型的HTML时,需要指定对应的字符编码

当html为ASCII或UTF-8编码时,可以不指定html字符编码,便可正确解析html为对应的soup:

#这里respHtml是ASCII或UTF-8编码,此时可以不指定编码类型,即可正确解析出对应的soup
soup = BeautifulSoup(respHtml);

当html为其他类型编码,比如GB2312的话,则需要指定相应的字符编码,BeautifulSoup才能正确解析出对应的soup:

比如:

#此处respHtml是GB2312编码的,所以要指定该编码类型,BeautifulSoup才能解析出对应的soup
htmlCharset = "GB2312";
soup = BeautifulSoup(respHtml, fromEncoding=htmlCharset);
Python 相关文章推荐
用Python代码来解图片迷宫的方法整理
Apr 02 Python
python关键字and和or用法实例
May 28 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
python 捕获shell脚本的输出结果实例
Jan 04 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
Python列表与元组的异同详解
Jul 02 Python
Apache部署Django项目图文详解
Jul 30 Python
python微信公众号开发简单流程实现
Mar 09 Python
django自带的权限管理Permission用法说明
May 13 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Python制作爬虫抓取美女图
Jan 20 #Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 #Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 #Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 #Python
使用python实现省市三级菜单效果
Jan 20 #Python
八大排序算法的Python实现
Jan 28 #Python
详解C++编程中一元运算符的重载
Jan 19 #Python
You might like
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
php 将excel导入mysql
2009/11/09 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
教你如何使用php session
2013/10/28 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
VUE安装使用教程详解
2019/06/03 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中关于字符串对象的一些基础知识
2015/04/08 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
python变量命名的7条建议
2019/07/04 Python
python requests证书问题解决
2019/09/05 Python
在python image 中实现安装中文字体
2020/05/16 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
项目采购员岗位职责
2014/04/15 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
详解TypeScript的基础类型
2022/02/18 Javascript