python BeautifulSoup使用方法详解


Posted in Python onNovember 21, 2013

直接看例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="https://3water.com" class="sister" id="link1">Elsie</a>,
<a href="https://3water.com" class="sister" id="link2">Lacie</a> and
<a href="https://3water.com" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc)
print soup.title
print soup.title.name
print soup.title.string
print soup.p
print soup.a
print soup.find_all('a')
print soup.find(id='link3')
print soup.get_text()

结果为:

<title>The Dormouse's story</title>
title
The Dormouse's story
<p class="title"><b>The Dormouse's story</b></p>
<a class="sister" href="https://3water.com" id="link1">Elsie</a>
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
<a class="sister" href="https://3water.com" id="link3">Tillie</a>
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...

可以看出:soup 就是BeautifulSoup处理格式化后的字符串,soup.title 得到的是title标签,soup.p  得到的是文档中的第一个p标签,要想得到所有标签,得用find_all
函数。find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.
get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。你可以试试 print soup.p.get_text()
其实是可以获得标签的其他属性的,比如我要获得a标签的href属性的值,可以使用 print soup.a['href'],类似的其他属性,比如class也是可以这么得到的(soup.a['class'])。
特别的,一些特殊的标签,比如head标签,是可以通过soup.head 得到,其实前面也已经说了。
如何获得标签的内容数组?使用contents 属性就可以 比如使用 print soup.head.contents,就获得了head下的所有子孩子,以列表的形式返回结果,
可以使用 [num]  的形式获得 ,获得标签,使用.name 就可以。
获取标签的孩子,也可以使用children,但是不能print soup.head.children 没有返回列表,返回的是 <listiterator object at 0x108e6d150>,
不过使用list可以将其转化为列表。当然可以使用for 语句遍历里面的孩子。
关于string属性,如果超过一个标签的话,那么就会返回None,否则就返回具体的字符串print soup.title.string 就返回了 The Dormouse's story
超过一个标签的话,可以试用strings
向上查找可以用parent函数,如果查找所有的,那么可以使用parents函数
查找下一个兄弟使用next_sibling,查找上一个兄弟节点使用previous_sibling,如果是查找所有的,那么在对应的函数后面加s就可以

如何遍历树?

使用find_all 函数

find_all(name, attrs, recursive, text, limit, **kwargs)

举例说明:

print soup.find_all('title')
print soup.find_all('p','title')
print soup.find_all('a')
print soup.find_all(id="link2")
print soup.find_all(id=True)

返回值为:

[<title>The Dormouse's story</title>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<a class="sister" href="https://3water.com" id="link2">Lacie</a>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]

通过css查找,直接上例子:

print soup.find_all("a", class_="sister")
print soup.select("p.title")

通过属性进行查找

print soup.find_all("a", attrs={"class": "sister"})

通过文本进行查找

print soup.find_all(text="Elsie")
print soup.find_all(text=["Tillie", "Elsie", "Lacie"])

限制结果个数

print soup.find_all("a", limit=2)

结果为:

[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[u'Elsie']
[u'Elsie', u'Lacie', u'Tillie']
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>]

总之,通过这些函数可以查找到想要的东西。

Python 相关文章推荐
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
获取python的list中含有重复值的index方法
Jun 27 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
实例讲解python中的协程
Oct 08 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
Python 列表去重去除空字符的例子
Jul 20 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
详解如何减少python内存的消耗
Aug 09 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
python装饰器使用方法实例
Nov 21 #Python
tornado框架blog模块分析与使用
Nov 21 #Python
python迭代器的使用方法实例
Nov 21 #Python
python生成器的使用方法
Nov 21 #Python
python单链表实现代码实例
Nov 21 #Python
python双向链表实现实例代码
Nov 21 #Python
python二叉树遍历的实现方法
Nov 21 #Python
You might like
php strrpos()与strripos()函数
2013/08/31 PHP
PHP多态代码实例
2015/06/26 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
React快速入门教程
2017/01/17 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
django数据库migrate失败的解决方法解析
2018/02/08 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
大专毕业生自我鉴定
2013/11/21 职场文书
企业文化建设实施方案
2014/03/22 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
房屋转让协议书
2014/10/18 职场文书
2015大学生实训报告
2014/11/05 职场文书
农业项目投资意向书
2015/05/09 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
使用 Apache 反向代理的设置技巧
2022/01/18 Servers