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计算回文数的方法
Mar 11 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python中的字符串内部换行方法
Jul 19 Python
Django基础知识与基本应用入门教程
Jul 20 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
python 读取.nii格式图像实例
Jul 01 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
Python读取ini配置文件传参的简单示例
Jan 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脚本的10个技巧(3)
2006/10/09 PHP
php中截取字符串支持utf-8
2007/01/18 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Vue的Options用法说明
2020/08/14 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
python内置数据类型之列表操作
2018/11/12 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python实现共轭梯度法
2019/07/03 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
python能做哪方面的工作
2020/06/15 Python
集中采购方案
2014/06/10 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
初中教师个人工作总结
2015/02/10 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers