Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >beautifulsoup的使用

beautifulsoup的使用

作者头像
hankleo
发布于 2020-09-17 02:07:01
发布于 2020-09-17 02:07:01
72500
代码可运行
举报
文章被收录于专栏:Hank’s BlogHank’s Blog
运行总次数:0
代码可运行

解析库

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库、执行速度适中 、文档容错能力强

Python 2.7.3 or 3.2.2)前的版本中文容错能力差

lxml HTML 解析器

BeautifulSoup(markup, "lxml")

速度快、文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, "xml")

速度快、唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档

速度慢、不依赖外部扩展

基本使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html = """
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
        <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">
                <span>Elsie</span>
            </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>
"""
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)

标签选择器

选择元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.title)
print(type(soup.title))
print(soup.head)
print(soup.p)

获取名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.title.name)

title

获取属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.p.attrs['name'])
print(soup.p['name'])

dromouse dromouse

获取内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.p.string)

The Dormouse's story

嵌套选择

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.head.title.string)

The Dormouse's story

子节点和子孙节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.p.contents)

['\n Once upon a time there were three little sisters; and their names were\n ', Elsie Elsie Elsie Elsie Elsie Elsie Elsie , '\n', Lacie, ' \n and\n ', Tillie, '\n and they lived at the bottom of a well.\n ']

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.p.children)
for i,child in enumerate(soup.p.children):
    print(i,child)

父节点和祖先节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.a.parent)

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.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(list(enumerate(soup.a.parents)))

兄弟节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(list(enumerate(soup.a.next_siblings))
print(list(enumerate(soup.a.previous_siblings)))

[(0, '\n'), (1, Lacie), (2, ' \n and\n '), (3, Tillie), (4, '\n and they lived at the bottom of a well.\n ')] [(0, '\n Once upon a time there were three little sisters; and their names were\n ')]

标准选择器

find_all(name,attrs,recursive,text,**kwargs)

可根据标签名、属性、内容查找文档

name

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for ul in soup.find_all('ul'):
    print(ul.find_all('li'))

attrs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.find_all(id='list-1'))
print(soup.find_all(class_='element'))

text

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.find_all(text='Foo'))
find( name , attrs , recursive , text , **kwargs )

find返回单个元素,find_all返回所有元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.find('ul'))
print(type(soup.find('ul')))
print(soup.find('page'))

find_parents() find_parent() find_parents()返回所有祖先节点,find_parent()返回直接父节点。

find_next_siblings() find_next_sibling() find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。

find_previous_siblings() find_previous_sibling() find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。

find_all_next() find_next() find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点

find_all_previous() 和 find_previous() find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

CSS选择器

通过select()直接传入CSS选择器即可完成选择

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

[<div class="panel-heading">
<h4>Hello</h4>
</div>]
[<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>]
[<li class="element">Foo</li>, <li class="element">Bar</li>]
<class 'bs4.element.Tag'>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for ul in soup.select('ul'):
    print(ul.select('li'))

[<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
[<li class="element">Foo</li>, <li class="element">Bar</li>]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

list-1 list-1 list-2 list-2

获取内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for li in soup.select('li'):
    print(li.get_text())

Foo Bar Jay Foo Bar

总结

  • 推荐使用lxml解析库,必要时使用html.parser
  • 标签选择筛选功能弱但是速度快
  • 建议使用find()、find_all()查询匹配单个结果或者多个结果
  • 如果对CSS选择器熟悉建议使用select()
  • 记住使用的获取属性和文本值得方法

参考来源:https://cuiqingcai.com/5548.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
BeautifulSoup的基本用法
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
py3study
2020/01/17
1.1K0
Python3中BeautifulSoup的使用方法
崔庆才,Python技术控,爬虫博文访问量已过百万。喜欢钻研,热爱生活,乐于分享。个人博客:静觅 | http://cuiqingcai.com/
生信宝典
2018/12/29
3.7K0
Python爬虫库BeautifulSoup的介绍与简单使用实例
BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,本文为大家介绍下Python爬虫库BeautifulSoup的介绍与简单使用实例其中包括了,BeautifulSoup解析HTML,BeautifulSoup获取内容,BeautifulSoup节点操作,BeautifulSoup获取CSS属性等实例
用户7081581
2020/03/18
2K0
Python3中BeautifulSoup的使用方法
我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有id或class来对作区分,所以我们借助于它们的结构和属性来提取不也是可以的吗?
小小科
2019/07/04
3.2K0
Python爬虫 Beautiful Soup库详解
前面介绍了正则表达式的相关用法,但是一旦正则表达式写的有问题,得到的可能就不是我们想要的结果了。而且对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都有 id 或 class 来作区分,所以借助它们的结构和属性来提取不也可以吗?
仲君Johnny
2024/02/08
2890
python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器。 beautifulSoup
coders
2018/01/04
1.8K0
python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
Python3网络爬虫实战-29、解析库
前面我们介绍了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多节点都有id或class来对作区分,所以我们借助于它们的结构和属性来提取不也是可以的吗?
py3study
2020/01/06
1.8K0
Python写爬虫你要了解的Bs4模块
BS4全称是Beatiful Soup,官方文档[1]它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为tiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。python写爬虫使用较多的一个模块。参考文章[2]
网络安全自修室
2020/07/22
1.2K0
六、解析库之Beautifulsoup模块
一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4 #安装 Beautiful Soup pip install beautifulsoup4 #安装
用户1214487
2018/01/24
1.7K0
Python爬虫:我这有美味的汤,你喝吗
在前面的文章中已经讲过了正则表达式的使用方法了,但是如果正则表达式出现问题,那么得到的结果就不是我们想要的内容。熟悉前端的朋友肯定知道,对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都用id和class来区分。所以可以借助网页的结构和属性来提取数据。
我被狗咬了
2021/01/13
2.4K0
Python爬虫:我这有美味的汤,你喝吗
Python 爬虫之网页解析库 BeautifulSoup
BeautifulSoup 是一个使用灵活方便、执行速度快、支持多种解析器的网页解析库,可以让你无需编写正则表达式也能从 html 和 xml 中提取数据。BeautifulSoup 不仅支持 Python 内置的 Html 解析器,还支持 lxml、html5lib 等第三方解析器。
keinYe
2019/08/01
1.3K0
BeautifulSoup4中文文档
1、解析html并以友好形式显示:BeautifulSoup(html_doc,'html.parser') print(soup.prettify()) html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p>
用户5760343
2022/05/14
3900
BeautifulSoup4用法详解
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
菲宇
2019/06/13
10.2K0
网络爬虫 | Beautiful Soup解析数据模块
从HTML文件中提取数据,除了使用XPath,另一种比较常用的解析数据模块。Beautiful Soup模块中查找提取功能非常强大、方便,且提供一些简单的函数来导航、搜索、修改分析树等功能。Beautiful Soup模块是Python的一个HTML解析库,借助网页的结构和属性来解析网页(比正则表达式简单、有效)。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
数据STUDIO
2021/06/24
6000
python︱HTML网页解析BeautifulSoup学习笔记
一、载入html页面信息 一种是网站在线的网页、一种是下载下来的静态网页。 1、在线网页 参考《python用BeautifulSoup库简单爬虫入门+案例(爬取妹子图)》中的载入内容: import
悟乙己
2018/01/02
3.3K0
python网络爬虫(5)BeautifulSoup的使用示范
结点中的contents输出直接子节点数组,可以通过for逐个输出,通过string属性直接输出内容
嘘、小点声
2019/07/31
1.1K0
二、爬虫基础库
request模块 安装 1 pip install requests 简单使用   import requests response=requests.get("https://movie.douban.com/cinema/nowplaying/beijing/") print(response.content) # 字节数据 print(response.text) # 字符数据 print(type(response)) # <class '
用户1214487
2018/01/24
1.8K0
二、爬虫基础库
​Python爬虫-BeautifulSoup详解
上一节我们已经可以获取到网页内容,但是获取到的却是一长串的 html 代码,并不是我们想要的数据。那这一节,我们就来看看怎么去解析这些网页,轻松的拿到我们想要的数据。
小一不二三
2019/12/31
1.5K0
​Python爬虫-BeautifulSoup详解
BeautifulSoup4库
和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
HammerZe
2022/05/11
1.2K0
BeautifulSoup4库
python爬虫---从零开始(四)BeautifulSoup库
BeautifulSoup是一个网页解析库,相比urllib、Requests要更加灵活和方便,处理高校,支持多种解析器。
小菜的不能再菜
2019/09/18
8210
python爬虫---从零开始(四)BeautifulSoup库
相关推荐
BeautifulSoup的基本用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档