Python BeautifulSoup 简单笔记
Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它可以很好的处理不规范标记并生成剖析树。通常用来分析爬虫抓取的web文档。对于 不规则的 Html文档,也有很多的补全功能,节省了开发者的时间和精力。
Beautiful Soup 的官方文档齐全,将官方给出的例子实践一遍就能掌握。官方英文文档,中文文档
一 安装 Beautiful Soup
安装 BeautifulSoup 很简单,下载 BeautifulSoup 源码。解压运行
python setup.py install 即可。
测试安装是否成功。键入 import BeautifulSoup 如果没有异常,即成功安装
二 使用 BeautifulSoup
1. 导入BeautifulSoup ,创建BeautifulSoup 对象
from BeautifulSoup import BeautifulSoup # HTML
from BeautifulSoup import BeautifulStoneSoup # XML
import BeautifulSoup # ALL doc = [
'<html><head><title>Page title</title></head>',
'<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
'<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
'</html>'
]
# BeautifulSoup 接受一个字符串参数
soup = BeautifulSoup(''.join(doc))
2. BeautifulSoup对象简介
用BeautifulSoup 解析 html文档时,BeautifulSoup将 html文档类似 dom文档树一样处理。BeautifulSoup文档树有三种基本对象。
2.1. soup BeautifulSoup.BeautifulSoup
type(soup)
<class 'BeautifulSoup.BeautifulSoup'>
2.2. 标记 BeautifulSoup.Tag
type(soup.html)
<class 'BeautifulSoup.Tag'>
2.3 文本 BeautifulSoup.NavigableString
type(soup.title.string)
<class 'BeautifulSoup.NavigableString'>
3. BeautifulSoup 剖析树
3.1 BeautifulSoup.Tag对象方法
获取 标记对象(Tag)
标记名获取法 ,直接用 soup对象加标记名,返回 tag对象.这种方式,选取唯一标签的时候比较有用。或者根据树的结构去选取,一层层的选择
>>> html = soup.html
>>> html
<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body></html>
>>> type(html)
<class 'BeautifulSoup.Tag'>
>>> title = soup.title
<title>Page title</title>
content方法
content方法 根据文档树进行搜索,返回标记对象(tag)的列表
>>> soup.contents
[<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body></html>]
>>> soup.contents[0].contents
[<head><title>Page title</title></head>, <body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body>]
>>> len(soup.contents[0].contents)
2
>>> type(soup.contents[0].contents[1])
<class 'BeautifulSoup.Tag'>
使用contents向后遍历树,使用parent向前遍历树
next 方法
获取树的子代元素,包括 Tag 对象 和 NavigableString 对象。。。
>>> head.next
<title>Page title</title>
>>> head.next.next
u'Page title'
>>> p1 = soup.p
>>> p1
<p id="firstpara" align="center">This is paragraph<b>one</b>.</p>
>>> p1.next
u'This is paragraph'
nextSibling 下一个兄弟对象 包括 Tag 对象 和 NavigableString 对象
>>> head.nextSibling
<body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body>
>>> p1.next.nextSibling
<b>one</b>
与 nextSibling 相似的是 previousSibling,即上一个兄弟节点。
replacewith方法
将对象替换为,接受字符串参数
>>> head = soup.head
>>> head
<head><title>Page title</title></head>
>>> head.parent
<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body></html>
>>> head.replaceWith('head was replace')
>>> head
<head><title>Page title</title></head>
>>> head.parent
>>> soup
<html>head was replace<body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body></html>
>>>
搜索方法
搜索提供了两个方法,一个是 find,一个是findAll。这里的两个方法(findAll和 find)仅对Tag对象以及,顶层剖析对象有效,但 NavigableString不可用。
findAll(name, attrs, recursive, text, limit, **kwargs)
接受一个参数,标记名
寻找文档所有 P标记,返回一个列表
>>> soup.findAll('p')
[<p id="firstpara" align="center">This is paragraph<b>one</b>.</p>, <p id="secondpara" align="blah">This is paragraph<b>two</b>.</p>]
>>> type(soup.findAll('p'))
<type 'list'>
寻找 id="secondpara"的 p 标记,返回一个结果集
>>> pid = type(soup.findAll('p',id='firstpara'))
>>> pid
<class 'BeautifulSoup.ResultSet'>
传一个属性或多个属性对
>>> p2 = soup.findAll('p',{'align':'blah'})
>>> p2
[<p id="secondpara" align="blah">This is paragraph<b>two</b>.</p>]
>>> type(p2)
<class 'BeautifulSoup.ResultSet'>
利用正则表达式
>>> soup.findAll(id=re.compile("para$"))
[<p id="firstpara" align="center">This is paragraph<b>one</b>.</p>, <p id="secondpara" align="blah">This is paragraph<b>two</b>.</p>]
读取和修改属性
>>> p1 = soup.p
>>> p1
<p id="firstpara" align="center">This is paragraph<b>one</b>.</p>
>>> p1['id']
u'firstpara'
>>> p1['id'] = 'changeid'
>>> p1
<p id="changeid" align="center">This is paragraph<b>one</b>.</p>
>>> p1['class'] = 'new class'
>>> p1
<p id="changeid" align="center" class="new class">This is paragraph<b>one</b>.</p>
>>>
剖析树基本方法就这些,还有其他一些,以及如何配合正则表达式。具体请看官方文档
3.2 BeautifulSoup.NavigableString对象方法
NavigableString 对象方法比较简单,获取其内容
>>> soup.title
<title>Page title</title>
>>> title = soup.title.next
>>> title
u'Page title'
>>> type(title)
<class 'BeautifulSoup.NavigableString'>
>>> title.string
u'Page title'
至于如何遍历树,进而分析文档,已经 XML 文档的分析方法,可以参考官方文档。
Python BeautifulSoup 简单笔记的更多相关文章
- Python学习笔记2-flask-sqlalchemy 简单笔记
flask-sqlalchemy 简单笔记 字数 阅读 评论 喜欢 flask-sqlalchemy SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架, ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
- Python开发简单爬虫 - 慕课网
课程链接:Python开发简单爬虫 环境搭建: Eclipse+PyDev配置搭建Python开发环境 Python入门基础教程 用Eclipse编写Python程序 课程目录 第1章 课程介绍 ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- Python源代码剖析笔记3-Python运行原理初探
Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...
- Python学习基础笔记(全)
换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
随机推荐
- leetcode 刷题日志 2018-3-28
树: 404. 左叶子之和 求所有左叶子结点之和 . 递归法 分析:递归法遍历结点,找左叶子结点 空指针判断 有左子节点?是叶子结点?是的话更新value的值 int sumOfLeftLeaves( ...
- Linux修改服务器ip
Linux基础二(修改ip地址.修改网关.修改DNS服务器.重新启动网络配置) 网络的初始化 .ip地址的修改(临时生效) 使用ifconfig命令 ifconfig 网卡名 ip地址 netma ...
- iOS 网络请求--- AFNetworing的使用
一.GET请求方式: //1.管理器 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; ...
- 一个App架构例子分析--UI层使用MVP模式;各层之间使用Otto实现通信
一.这个App整体的架构划分: 分为四大模块: 1.app模块 2.common模块 3.domain模块 4.model模块 app模块的依赖: dependencies { c ...
- loj6102 「2017 山东二轮集训 Day1」第三题
传送门:https://loj.ac/problem/6102 [题解] 贴一份zyz在知乎的回答吧 https://www.zhihu.com/question/61218881 其实是经典问题 # ...
- 【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛
[题意]n头牛,其中最高h.给定r组关系a和b,要求满足h[b]>=h[a]且a.b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度. [算法]差分 [题解]容易发现r组关系只能 ...
- 关于SQL注入的五大报错注入函数
~全部都以查user()为例子~ 1.floor()id = 1 and (select 1 from (select count(*),concat(version(),floor(rand(0) ...
- bzoj 1927 网络流
首先我们可以知道这道题中每个点只能经过一次,那么我们引入附加源汇source,sink,那么我们可以将每个点拆成两个点,分别表示对于图中这个节点我们的进和出,那么我们可以连接(source,i,1,0 ...
- error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'
error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System. ...
- java===java基础学习(12)---方法的重写和重载
覆盖 / 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也 ...