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 ZipFile模块详解
Nov 01 Python
Python记录详细调用堆栈日志的方法
May 05 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python 专题一 函数的基础知识
Mar 16 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python装饰器用法实例分析
Jan 14 Python
python实现五子棋小游戏
Mar 25 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
Python常用数字处理基本操作汇总
Sep 10 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.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
js实现简单的秒表
2020/01/16 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python如何发布程序的详细教程
2018/10/09 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
交通事故委托书范本
2014/09/28 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android