BeautifulSoup是一个可以从HTML或者XML文件中提取数据的Python库,它通过解析器把文档解析为利于人们理解的文档导航模式,有利于查找和修改文档。

BeautifulSoup3目前已经停止开发,现在推荐使用BeautifulSoup4,它被移植到了bs4中。

# 使用时需要导入
from bs4 import BeautifulSoup

解析器

BeautifulSoup4中常用4种主要的解析器,使用前需要安装:

#不同系统安装方法
$ apt-get install Python-lxml
$ easy_install lxml
$ pip install lxml # pycharm中安装可以先import xxx,显示有错误然后点击安装,安装后删除import语句,即可正常使用
解析器的优缺点对比
解析器 使用方法 优势 劣势
Python标准库

BeautifulSoup(DocumentName, "html.parser")

  • Python的内置标准库
  • 不需要单独安装
  • 执行速度适中
  • 文档容错能力强
Python 2.7.3 or 3.2.2前的班中文容错能力差
lxml HTML解析器 BeautifulSoup(DocumentName, "lxml")
  • 速度快
  • 文档容错能力强
需要安装C语言库
lxml XML解析器

BeautifulSoup(DocumentName, "xml")

BeautifulSoup(DocumentName, ["lxml","xml"])

  • 速度快
  • 唯一支持XML的解析器
需要安装C语言库
html5lib BeautifulSoup(DocumentName, "html5lib")
  • 最好的容错
  • 以浏览器的方式解析文档
  • 生成HTML5格式的文档
速度慢,需要依赖python库

不同解析器的解析结果:

# 符合HTML标准的解析结果
htmldoc = "<a><p></p></a>"
print("None :",BeautifulSoup(htmldoc))
print("html.parser :", BeautifulSoup(htmldoc, "html.parser"))
print("lxml :", BeautifulSoup(htmldoc, "lxml"))
print("xml :", BeautifulSoup(htmldoc, "lxml-xml"))
print("html5lib :", BeautifulSoup(htmldoc, "html5lib")) """
结果为:
None : <html><body><a><p></p></a></body></html>
html.parser : <a><p></p></a>
lxml : <html><body><a><p></p></a></body></html>
xml : <?xml version="1.0" encoding="utf-8"?>
  <a><p/></a>
html5lib : <html><head></head><body><a><p></p></a></body></html>
"""
# 不符合HTML标准的解析结果
htmldoc = "<a></p></a>"
print("None :",BeautifulSoup(htmldoc))
print("html.parser :", BeautifulSoup(htmldoc, "html.parser"))
print("lxml :", BeautifulSoup(htmldoc, "lxml"))
print("xml :", BeautifulSoup(htmldoc, "lxml-xml"))
print("html5lib :", BeautifulSoup(htmldoc, "html5lib")) """
结果为:
None : <html><body><a></a></body></html>
html.parser : <a></a>
lxml : <html><body><a></a></body></html>
xml : <?xml version="1.0" encoding="utf-8"?>
          <a/>
html5lib : <html><head></head><body><a><p></p></a></body></html>
"""

html5lib会把所有的标签不全,并且加上html、head、body,标准的html格式;默认、html.parser、lxml 解析器会把错误标签忽略掉。

编码

任何HTML或者XML文档都有自己的编码方式,但使用BeautifulSoup解析后,文档都会被转换为Unicode,输出时编码均为UTF-8。

因为BeautifulSoup用来编码自动检测库来识别当前文档的编码,并自动转换为Unicode编码。但也有小概率会识别出错,可以用.original_encoding来检测编码格式。

并且设置from_encoding参数可以提高文档的解析速度。

htmldoc = b"<h1>\xed\xe5\xec\xf9</h1>"
soup = BeautifulSoup(htmldoc, from_encoding="iso-8859-8")
print(soup.h1)
print(soup.original_encoding) """
结果:
<h1>םולש</h1>
'iso8859-8'
"""

指定输出编码:


htmldoc = b"<h1>\xed\xe5\xec\xf9</h1>"
soup = BeautifulSoup(htmldoc, from_encoding="iso-8859-8")
print(soup.prettify("latin-1"))
"""
结果:
b'<h1>\n νεμω\n</h1>'
"""

遍历文档树:

1. 注释<class 'bs4.element.Comment'> 和 替换Comment内容

htmldoc = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(htmldoc)
comment = soup.b.string
print(comment)
print(type(comment))
print(soup2.b)
print(soup2.b.prettify()) #comment特色输出方式 # 替换Comment
cdata= CData("A CData block")
comment.replace_with(cdata)
print(soup2.b.prettify()) """
结果:
Hey, buddy. Want to buy a used parser?
<class 'bs4.element.Comment'>
<b><!--Hey, buddy. Want to buy a used parser?--></b>
<b>
<!--Hey, buddy. Want to buy a used parser?-->
</b>
<b>
<![CDATA[A CData block]]>
</b>
"""

CData使用时需要导入 from bs4 import CData

2. soup.tagName  返回类型 <class 'bs4.element.Tag'>,得到文档中第一个tagName标签 ==  soup.find(tagName)

soup.div #得到文章中第一个div标签
soup.a #得到文章中第一个a标签

3. soup.tagName.get_text() / soup.tagName.text 返回类型 <class 'str'>,得到该标签内容,对每个BeautifulSoup处理后的对象都生效。

soup.a.get_text()
soup.a.text

4. soup.tagName.tagName["AttributeName"] 获得标签内属性值,逐级访问标签可以用 . 连接,某个属性值用 ["属性名"] 访问。

soup.div.a['href']

5. soup.ul.contents 返回类型为<class 'list'>,可以用下标访问其中的元素

 list内元素类型为 <class 'bs4.element.Tag'> or <class 'bs4.element.NavigableString'>

 如果是单一标签可以用 string 返回文本,如果超过1个标签就返回None

soup.ul.contents
type(soup.ul.contents) #<class 'list'>
soup.ul.contents[0].string
type(soup.ul.contents[0])

6. find_all(name, attrs, recursice, text, limit, **kwargs),返回的类型为 <class 'bs4.element.ResultSet'>

# 找到所有标签为tagName的集合
soup.find_all("tagName")
soup.find_all("a") # 找到所有标签为tagName 且 class=className的集合
soup.find_all("tagName", "className")
soup.find_all("div","Score") # 找到所有id=idName的标签
soup.find_all(id = "idName") # 使用多个指定名字的参数可以同时过滤tag的多个属性:
soup.find_all(href = re.compile("else"))
soup.find_all(href=re.compile("elsie"), id='link1')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] # 有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性
data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression
# 可以用attrs 参数定义一个字典参数来搜索包含特殊属性的tag
data_soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>] # 找到所有有id的标签
soup.find_all(id = True) # 找到所有标签为tagName且class = "className"的标签
soup.find_all("tagName", class_ = "className")
# css class参数过滤
soup.find_all(class_=re.compile("itl"))
# [<p class="title"><b>The Dormouse's story</b></p>] # 通过文本查找文本
soup.find_all(text = "textContent")
soup.find_all(text = ["Content1", "Content2"])
# 文本参数过滤
soup.find_all(text=re.compile("Dormouse")) # 限制结果个数
soup.find_all("tagName", limit = 2)
elemSet = soup.find_all("div", limit = 2)
# 可循环出每个元素
for item in elemSet:
print(item)
print(item.text)

7. 通过 css 选择器查找,返回值 <class 'list'>,list中元素类型为 <class 'bs4.element.Tag'>

htmldoc = """
<html><head><title>The Dormouse's story</title></head>
<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="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(htmldoc, "lxml") # tag标签查找
soup.select("title") # tag标签逐层查找
soup.select("html head title")
soup.select("head title")
soup.select("body a") # tag标签下的直接子标签
soup.select("head > title")
soup.select("p > a")
soup.select("p > a:nth-of-type(2)")
soup.select("p > #link1") # css类名查找
soup.select(".sister") # id 查找
soup.select("#link1") # 通过属性查找
soup.select("a[href]")
soup.select('a[href="http://example.com/elsie"]')
soup.select('a[href^="http://example.com/"]')
soup.select('a[href$="tillie"]')
soup.select('a[href*=".com/el"]')
type(soup.select("a[href]")) # <class 'list'> # 通过循环获取到每个tag
list = soup.select("a[href]")
for item in list:
print(item)
print(type(item)) # <class 'bs4.element.Tag'>
print(item.text)
print(item.string)

Python BeautifulSoup库的用法的更多相关文章

  1. python BeautifulSoup库用法总结

    1. Beautiful Soup 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...

  2. PYTHON 爬虫笔记五:BeautifulSoup库基础用法

    知识点一:BeautifulSoup库详解及其基本使用方法 什么是BeautifulSoup 灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便实现网页信息的提取库. ...

  3. python BeautifulSoup库的基本使用

    Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以 ...

  4. python 时间库的用法 时区的转化

    1. 月份的加减 https://blog.csdn.net/qq_18863573/article/details/79444094 第三方模块:python-dateutil import dat ...

  5. python requests库的用法

    参考  http://docs.python-requests.org/zh_CN/latest/user/quickstart.html 1.传递url参数 >>> payload ...

  6. Python爬虫-- BeautifulSoup库

    BeautifulSoup库 beautifulsoup就是一个非常强大的工具,爬虫利器.一个灵活又方便的网页解析库,处理高效,支持多种解析器.利用它就不用编写正则表达式也能方便的实现网页信息的抓取 ...

  7. Python HTTP库requests中文页面乱码解决方案!

    http://www.cnblogs.com/bitpeng/p/4748872.html Python中文乱码,是一个很大的坑,自己不知道在这里遇到多少问题了.还好通过自己不断的总结,现在遇到乱码的 ...

  8. $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  9. Python爬虫小白入门(三)BeautifulSoup库

    # 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...

随机推荐

  1. (十)ASP.NET自定义用户控件(3)

    using HX.DHL.EIP.Services.Def.Localization; using HX.DHL.EIP.Web.Framework; using System; using Syst ...

  2. 牌型总数——第六届蓝桥杯C语言B组(省赛)第七题

    原创 牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得 ...

  3. 国外物联网平台(5):Exosite Murano

    国外物联网平台(5)——Exosite Murano 马智 定位 Murano是一个基于云的IoT软件平台,提供安全.可扩展的基础设施,支持端到端的生态系统,帮助客户安全.可扩展地开发.部署和管理应用 ...

  4. .netcore2.0 Startup 全局配置文件小技巧

  5. WPF 控件库——带有惯性的ScrollViewer

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  6. Linux环境下mysql安装并配置远程访问

    环境:centOS 1.下载mysql安装文件 [root@localhost ~]# wget http://dev.mysql.com/get/mysql-community-release-el ...

  7. CString、string、string.h的区别

    CString.string.string.h的区别   CString:CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才能使用. ...

  8. P2925 [USACO08DEC]干草出售Hay For Sale 题解

    \(\Huge{dp第一题}\) 题目描述 农民john面临一个很可怕的事实,因为防范失措他存储的所有稻草给澳大利亚蟑螂吃光了,他将面临没有稻草喂养奶牛的局面.在奶牛断粮之前,john拉着他的马车到农 ...

  9. 如何查看Centos版本

    使用命令 cat /etc/centos-release 查看效果如下图 当然,你也可以查看红帽的版本 cat /etc/redhat-release 郴州软件开发培训 郴州软件培训 郴州java培训 ...

  10. [转][Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法

    1.U3D经常莫名奇妙崩溃.   一般是由于空异常造成的,多多检查自己的引用是否空指针.   2.编码切换警告提示.   警告提示:Some are Mac OS X (UNIX) and some ...