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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
Python的argparse库使用详解
Oct 09 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
Pytest allure 命令行参数的使用
Apr 18 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
Python 发送SMTP邮件的简单教程
Jun 24 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/12/09 PHP
PHP制作万年历
2015/01/07 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
yii2安装详细流程
2018/05/23 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
javascript数组排序汇总
2015/07/07 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
跟老齐学Python之关于类的初步认识
2014/10/11 Python
python中的代码编码格式转换问题
2015/06/10 Python
python基础教程之Filter使用方法
2017/01/17 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
什么是事务?事务有哪些性质?
2012/03/11 面试题
2016年小学生教师节广播稿
2015/12/18 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书