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求素数示例分享
Feb 16 Python
Python中的类与对象之描述符详解
Mar 27 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
jquery实现的树形目录实例
2015/06/26 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
jqTransform美化表单
2015/10/10 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
解决vue中的无限循环问题
2020/07/27 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
Python爬虫实现百度图片自动下载
2018/02/04 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
wxPython实现带颜色的进度条
2019/11/19 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
保洁主管岗位职责
2013/11/20 职场文书
社团成立邀请函
2014/01/08 职场文书
小学教师国培感言
2014/02/08 职场文书
小学家长学校培训材料
2014/08/24 职场文书
我的中国心演讲稿
2014/09/04 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
闪闪的红星观后感
2015/06/08 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
如何使用pdb进行Python调试
2021/06/30 Python