python3解析库BeautifulSoup4的安装配置与基本用法

本文详细介绍了Python的BeautifulSoup4库,用于HTML和XML解析。它提供了简单的API,自动处理编码,支持多种解析器。文章涵盖了安装、解析器选择、基本用法,包括节点选择、方法选择器、CSS选择器以及修改标签的方法,同时强调了BeautifulSoup的灵活性和实用性。
摘要由CSDN通过智能技术生成

前言

Beautiful Soup是python的一个HTML或XML的解析库,我们可以用它来方便的从网页中提取数据,它拥有强大的API和多样的解析方式。

Beautiful Soup的三个特点:

  • Beautiful Soup提供一些简单的方法和python式函数,用于浏览,搜索和修改解析树,它是一个工具箱,通过解析文档为用户提供需要抓取的数据
  • Beautiful Soup自动将转入稳定转换为Unicode编码,输出文档转换为UTF-8编码,不需要考虑编码,除非文档没有指定编码方式,这时只需要指定原始编码即可
  • Beautiful Soup位于流行的Python解析器(如lxml和html5lib)之上,允许您尝试不同的解析策略或交易速度以获得灵活性。

1、Beautiful Soup4的安装配置

Beautiful Soup4通过PyPi发布,所以可以通过系统管理包工具安装,包名字为beautifulsoup4

$easy_install beautifulsoup4
或者
$pip install beautifulsoup4

也可用通过下载源码包来安装:


    #wget https://www.crummy.com/software/BeautifulSoup/bs4/download/4.0/beautifulsoup4-4.1.0.tar.gz
    #tar xf beautifulsoup4-4.1.0.tar.gz
    #cd beautifulsoup4
    #python setup.py install

Beautiful Soup在解析时实际上是依赖解析器的,它除了支持python标准库中的HTML解析器外还支持第三方解析器如lxml

Beautiful Soup支持的解析器,以及它们的优缺点:

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup,“html.parser”)
  • Python的内置标准库
  • 执行速度适中
  • 文档容错能力强

|

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

lxml HTML 解析器 | BeautifulSoup(markup,“lxml”) |

  • 速度快
  • 文档容错能力强

|

  • 需要安装C语言库

lxml XML 解析器 |

BeautifulSoup(markup,[“lxml”, “xml”])

BeautifulSoup(markup,“xml”)

|

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

|

  • 需要安装C语言库

html5lib | BeautifulSoup(markup,“html5lib”) |

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

|

  • 速度慢
  • 不依赖外部扩展

安装解析器:


    $pip install lxml
    $pip install html5lib

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib,
因为那些Python版本的标准库中内置的HTML解析方法不够稳定

2、BeautifulSoup的基本用法

通过传入一段字符或一个文件句柄,BeautifulSoup的构造方法就能得到一个文档的对象,选择合适的解析器来解析文档,如手动指定将选择指定的解析器来解析文档,Beautiful
Soup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment

注意: BeautifulSoup版本4的包是在bs4中引入的


    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="http://example.com/elsie" rel="external nofollow" class="sister" id="link1">Elsie</a>,
    <a href="http://example.com/lacie" rel="external nofollow" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" rel="external nofollow" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    
    <p class="story">...</p>
    """
    markup="<b><!--Hey, buddy. Want to buy a used parser?--></b>"
    soup=BeautifulSoup(html_doc,"lxml")
    soup1=BeautifulSoup(markup,"lxml")
    tag=soup.a
    navstr=tag.string
    comment=soup1.b.string
    print(type(tag)) #Tag标签对象
    print(type(comment)) #Comment对象包含文档注释内容
    print(type(navstr)) #NavigableString对象包装字符串内容
    print(type(soup)) #BeautifulSoup对象为文档的全部内容
    
    #
    <class 'bs4.element.Tag'>
    <class 'bs4.element.Comment'>
    <class 'bs4.element.NavigableString'>
    <class 'bs4.BeautifulSoup'>

(1)节点选择器(tag)

直接调用节点的名称就可以选择节点元素,节点可以嵌套选择返回的类型都是bs4.element.Tag对象


    soup=BeautifulSoup(html_doc,'lxml')
    print(soup.head) #获取head标签
    print(soup.p.b) #获取p节点下的b节点
    print(soup.a.string) #获取a标签下的文本,只获取第一个

name属性获取节点名称:


    soup.body.name

attrs属性获取节点属性,也可以字典的形式直接获取,返回的结果可能是列表或字符串类型,取决于节点类型


    soup.p.attrs #获取p节点所有属性
    soup.p.attrs['class'] #获取p节点class属性
    soup.p['class'] #直接获取p节点class属性

string属性获取节点元素包含的文本内容:


    soup.p.string #获取第一个p节点下的文本内容

contents属性获取节点的直接子节点,以列表的形式返回内容


    soup.body.contents #是直接子节点,不包括子孙节点

children属性获取的也是节点的直接子节点,只是以生成器的类型返回


    soup.body.children

descendants属性获取子孙节点,返回生成器


    soup.body.descendants

parent属性获取父节点,parents获取祖先节点,返回生成器


    soup.b.parent
    soup.b.parents

next_sibling属性返回下一个兄弟节点,previous_sibling返回上一个兄弟节点,注意换行符也是一个节点,所以有时候在获取兄弟节点是通常是字符串或者空白


    soup.a.next_sibling
    soup.a.previous_sibling

next_siblings和previous_sibling分别返回前面和后面的所有兄弟节点,返回生成器


    soup.a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值