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计算最小优先级队列代码分享
Dec 18 Python
Python做文本按行去重的实现方法
Oct 19 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
使用python模拟命令行终端的示例
Aug 13 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
Python读写csv文件流程及异常解决
Oct 20 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
简单介绍Python中的try和finally和with方法
2015/05/05 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
Python程序中设置HTTP代理
2016/11/06 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
python3中zip()函数使用详解
2018/06/29 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
PyQt5实现登录页面
2020/05/30 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
应届大学生求职信
2013/12/01 职场文书
校园元旦活动总结
2014/07/09 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
导游词之无锡古运河
2019/11/14 职场文书
如何用python反转图片,视频
2021/04/24 Python