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代码来解图片迷宫的方法整理
Apr 02 Python
Python Web框架Tornado运行和部署
Oct 19 Python
python版本的仿windows计划任务工具
Apr 30 Python
python组合无重复三位数的实例
Nov 13 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
Python制作词云图代码实例
Sep 09 Python
详解Python绘图Turtle库
Oct 12 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
Python3 A*寻路算法实现方式
Dec 24 Python
python模块内置属性概念及实例
Feb 18 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 Python
Python基本的内置数据类型及使用方法
Apr 13 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
PHP输出缓存ob系列函数详解
2014/03/11 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
JavaScript生成图形验证码
2020/08/24 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
解决vue addRoutes不生效问题
2020/08/04 Javascript
JS实现页面侧边栏效果探究
2021/01/08 Javascript
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
python定义类的简单用法
2020/07/24 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
2014植树节活动总结
2014/03/11 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
应届毕业生求职信范文
2015/03/19 职场文书