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 相关文章推荐
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
分享6个隐藏的python功能
Dec 07 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
python监控文件并且发送告警邮件
Jun 21 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
Django 配置多站点多域名的实现步骤
May 17 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
Jul 15 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Python socket服务常用操作代码实例
Jun 22 Python
QT5 Designer 打不开的问题及解决方法
Aug 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
用PHP函数解决SQL injection
2006/12/09 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
详解微信UnionID作用
2019/05/15 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
python区分不同数据类型的方法
2019/10/14 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
python中的错误如何查看
2020/07/08 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
会展中心部门工作职责
2013/11/27 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
爱国演讲稿400字
2014/05/07 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
2019新员工心得体会
2019/06/25 职场文书