摘自   http://www.cnblogs.com/twinsclover/archive/2012/04/26/2471704.html

序言

之前用python爬取网页的时候,一直用的是regex或者自带的库sgmllib里的SGMLParser。但是遇到复杂一点的情况时,SGMLParser往往就不那么给力了!(哈,难道说我 too native了?毕竟beautifulSoup是继承sgmlparser的么~)所以,我寻寻觅觅寻寻觅觅,发现了BeautifulSoup这么个玩意。BeautifulSoup提供了很人性化的parser tree,有了它,我们可以简单的抽取出tagname, attrs, text等等等等...

入门

(ps:其实入门什么的看官方文档是最好的了,这里只是记录一下简单的用法。)

首先先介绍实际工作中最常用的几个方法:

举例的html代码(就用官方例子好了):

1

2

3

Page title

4

5

6

7 This is paragraphone.

8

9

10 This is paragraphtwo.

11

12

13

0、初始化:

1 soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == str

1、用tag获取相应代码块的剖析树:

既然要分析html,首先要找到对我们有用的tag块,beautiful提供了非常便利的方式。

#当用tag作为搜索条件时,我们获取的包含这个tag块的剖析树:

#ooo

#这里获取head这个块

head = soup.find('head')

# or

# head = soup.head

# or

# head = soup.contents[0].contents[0]

运行后,我们会得到:

1

2

Page title

3

这里小灯我还是推荐使用第二种方法,find方法在当前tag剖析树(当前这个html代码块中)寻找符合条件的子树并返回。find方法提供多种查询方式,包括用喜闻乐见的regex哦~之后会详细介绍。

contents属性是一个列表,里面保存了该剖析树的直接儿子。

如:

1 html = soup.contents[0] # ...

2 head = html.contents[0] #

...

3 body = html.contents[1] #

...

2、用contents[], parent, nextSibling, previousSibling寻找父子兄弟tag

为了更加方便灵活的分析html代码块,beautifulSoup提供了几个简单的方法直接获取当前tag块的父子兄弟。

假设我们已经获得了body这个tag块,我们想要寻找,

, 第一个

, 第二个

这四个tag块:

# body = soup.bodyhtml = body.parent # html是body的父亲

head = body.previousSibling # head和body在同一层,是body的前一个兄弟

p1 = body.contents[0] # p1, p2都是body的儿子,我们用contents[0]取得p1

p2 = p1.nextSibling # p2与p1在同一层,是p1的后一个兄弟, 当然body.content[1]也可得到

print p1.text

# u'This is paragraphone.'

print p2.text

# u'This is paragraphtwo.'

# 注意:1,每个tag的text包括了它以及它子孙的text。2,所有text已经被自动转

#为unicode,如果需要,可以自行转码encode(xxx)

然而,如果我们要寻找祖先或者孙子tag怎么办呢?? 用while循环吗? 不, beautifulsoup已经提供了方法。

3、用find, findParent, findNextSibling, findPreviousSibling寻找祖先或者子孙 tag:

有了上面的基础,这里应该很好理解了,例如find方法(我理解和findChild是一样的),就是以当前节点为起始,遍历整个子树,找到后返回。

而这些方法的复数形式,会找到所有符合要求的tag,以list的方式放回。他们的对应关系是:find->findall, findParent->findParents, findNextSibling->findNextSiblings...

如:

1 print soup.findAll('p')

2 # [

This is paragraph one.

,

This is paragraph two.

]

这里我们重点讲一下find的几种用法,其他的类比:

find(name=None, attrs={}, recursive=True, text=None, **kwargs)

1) 搜索tag:

1 find(tagname) # 直接搜索名为tagname的tag 如:find('head')

2 find(list) # 搜索在list中的tag,如: find(['head', 'body'])

3 find(dict) # 搜索在dict中的tag,如:find({'head':True, 'body':True})

4 find(re.compile('')) # 搜索符合正则的tag, 如:find(re.compile('^p')) 搜索以p开头的tag

5 find(lambda) # 搜索函数返回结果为true的tag, 如:find(lambda name: if len(name) == 1) 搜索长度为1的tag

6 find(True) # 搜索所有tag

2) 搜索属性(attrs):

1 find(id='xxx') # 寻找id属性为xxx的

2 find(attrs={id=re.compile('xxx'), algin='xxx'}) # 寻找id属性符合正则且algin属性为xxx的

3 find(attrs={id=True, algin=None}) # 寻找有id属性但是没有algin属性的

3) 搜索文字(text):

注意,文字的搜索会导致其他搜索给的值如:tag, attrs都失效。

方法与搜索tag一致

4) recursive, limit:

recursive=False表示只搜索直接儿子,否则搜索整个子树,默认为True。

当使用findAll或者类似返回list的方法时,limit属性用于限制返回的数量,如findAll('p', limit=2): 返回首先找到的两个tag

*4、用next,previous寻找上下文tag(少用)

这里我们主要看看next, next是取得当前的tag的下一个(按代码从上到下的顺序)tag块。这与contents是不一样的,千万别混淆了哦^ ^

我们举个栗子来看看

1

2 a

3 b

4 c

5

我们看看next的实际效果:

1 a = soup.a

2 b = soup.b

3 n1 = b.next

4 n2 = n1.next

输出一下:

1 print a.next

2 # u'a'

3 print n1

4 # u'b'

5 print n2

6 # c

所以,next仅仅是获取文档上的“下一个”的tag,和剖析树中的位置无关。

当然也有findNext和findAllNext方法。

至于previous, 表示上一个tag块,就类比一下吧~^ ^

python 分析html_用python的BeautifulSoup分析html相关推荐

  1. python html解析查找字符串_用python的BeautifulSoup分析html

    序言 之前用python爬取网页的时候,一直用的是regex或者自带的库sgmllib里的SGMLParser.但是遇到复杂一点的情况时,SGMLParser往往就不那么给力了!(哈,难道说我 too ...

  2. Python正则匹配HTML,python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结...

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  3. python计算商品总价_GitHub - ideaOzy/data_analysis: 基于Python的南京二手房数据采集及可视化分析...

    基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...

  4. Python爬取天气数据及可视化分析!

    来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...

  5. 基于 Python 的高考志愿高校及专业分析系统

    温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 本项目利用网络爬虫技术从某高考网抓取各大高校的历年高空录取分数线,并进行数据清洗存储到文件系统中,对 ...

  6. 【毕业设计_课程设计】基于Python的南京二手房数据采集及可视化分析

    文章目录 0 项目说明 1 内容简介 2 应用技术介绍 3 数据采集 3.1 数据清洗 4 数据可视化 5 项目工程 0 项目说明 基于Python的南京二手房数据采集及可视化分析 提示:适合用于课程 ...

  7. Python爬取天气数据及可视化分析(附源码)

    大家好,我是辰哥(文末送书) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本次使用python中requests和Be ...

  8. Python爬取天气数据及可视化分析

    Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...

  9. python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?...

    原标题:干货!如何用 Python+KNN 算法实现城市空气质量分析与预测? 作者 | 李秋键 责编 | 伍杏玲 封图 | CSDN 付费下载自东方 IC 出品 | CSDN(ID:CSDNnews) ...

最新文章

  1. JDBC编程:2(数据库的基本操作)
  2. linux查看网卡速率
  3. 广义逆高斯分布及推广(To be continued)
  4. 易语言单窗口单ip软件源码_游戏工作室如何防封?游戏账号和IP被封的解决方法...
  5. 文本分类入门(二)文本分类的方法
  6. PageRanke算法
  7. headroom.js插件使用方法
  8. ConsurrentDictionary并发字典知多少?
  9. linux 中阻塞与非阻塞 同步与异步
  10. oracle mysql 安全性_oracle mysql语句
  11. class? clazz参数_Java如何获取方法参数具体名称?这是个好问题
  12. 一夜抢空880万!中国最狠印钞机,终于开始收割年轻人了
  13. 11_条件随机场CRF2_统计学习方法
  14. cv2.show()cv2.waitKey()cv2.VideoCapture()的使用
  15. 计算机一级怎么发送邮件到别人邮箱,电脑怎样发邮件到指定的邮箱地址(小白必须电脑操作邮件收发)...
  16. 数字电视打开一直连接服务器50%,广电有线电视宽带故障判断及处理
  17. 有关Idea的Invalidate Caches/Restart
  18. 转帖:免费完美激活Windows7旗舰版
  19. The release Method
  20. echarts-gauge-bar

热门文章

  1. 无招胜有招之Java进阶JVM(一)
  2. HMAC算法及其应用
  3. Spring Cloud Feign - 内部实现细节
  4. Java HttpClient使用小结
  5. Effective Java之慎用可变参数(四十二)
  6. UnpooledHeadByteBuf源码分析
  7. 【击败时间100%】剑指 Offer 38. 字符串的排列
  8. Web前端开发笔记——第三章 CSS语言 第四节 CSS列表、表格样式
  9. 修改Mysql表中自增字段的初始值
  10. 合并两个无序数组java_88. 合并两个有序数组