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下利用OpenCV来旋转图像的教程
Apr 16 Python
Python的Urllib库的基本使用教程
Apr 30 Python
Python基础知识_浅谈用户交互
May 31 Python
python logging添加filter教程
Dec 24 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
解决paramiko执行命令超时的问题
Apr 16 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
python怎么对数字进行过滤
Jul 05 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
python中二分查找法的实现方法
Dec 06 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
SWFObject Flash js调用类
2008/07/08 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python实现Event回调机制的方法
2019/02/13 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python实现统计代码行数的小工具
2019/09/19 Python
python中Lambda表达式详解
2019/11/20 Python
对python中各个response的使用说明
2020/03/28 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
农林环境专业求职信
2014/03/13 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
校园广播站开场白
2015/06/01 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
Django框架模板用法详解
2022/06/10 Python
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技