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中sets模块的用法实例
Sep 30 Python
使用python遍历指定城市的一周气温
Mar 31 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
python八皇后问题的解决方法
Sep 27 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
使用pandas读取文件的实现
Jul 31 Python
django连接oracle时setting 配置方法
Aug 29 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
javascript函数库-集合框架
2007/04/27 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
python中实现定制类的特殊方法总结
2014/09/28 Python
python的类方法和静态方法
2014/12/13 Python
介绍Python中的__future__模块
2015/04/27 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
Django框架 querySet功能解析
2019/09/04 Python
pycharm修改file type方式
2019/11/19 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
出纳会计岗位职责
2014/03/12 职场文书
新年联欢会主持词
2014/03/27 职场文书
优秀员工事迹材料
2014/12/20 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP