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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
儿童编程python入门
May 08 Python
python3安装speech语音模块的方法
Dec 24 Python
Python异常处理例题整理
Jul 07 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
python 元组和列表的区别
Dec 30 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 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简介
2006/10/09 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
php时间函数用法分析
2016/05/28 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
仅利用30行Python代码来展示X算法
2015/04/01 Python
Python解惑之整数比较详解
2017/04/24 Python
Python使用pymysql小技巧
2017/06/04 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
擅自离岗检讨书
2014/02/11 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
企业计划生育责任书
2015/05/09 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书