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实现查找系统盘中需要找的字符
Jul 14 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
vscode 远程调试python的方法
Dec 01 Python
python 提取key 为中文的json 串方法
Dec 31 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
numpy.array 操作使用简单总结
Nov 08 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
python中的装饰器该如何使用
Jun 18 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
PHP操作数组相关函数
2011/02/03 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
使用PHP编写发红包程序
2015/07/22 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
js实现简单的验证码
2015/12/25 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
BootStrap的两种模态框方式
2017/05/10 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
python简单实现获取当前时间
2016/08/27 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Python科学画图代码分享
2017/11/29 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
什么是servlet链?
2014/07/13 面试题
料理师求职信
2014/01/30 职场文书
七年级政治教学反思
2014/02/03 职场文书
五年级音乐教学反思
2014/02/06 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
应用心理学专业求职信
2014/08/04 职场文书
国富论读书笔记
2015/06/26 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
父亲节感言
2015/08/03 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers