python爬虫-Beautiful Soup库入门
说明
Beautiful Soup库是一个HTML/XML的解析器,主要的功能是解析和提取 HTML/XML数据。
Beautiful Soup库安装
打开命令行使用pip安装Beautiful Soup第三方库
pip install beautifulsoup4
Beautiful Soup库的引用
安装时的名字是beautifulsoup4,但在python中引用这个库的名字是bs4,其中BeautifulSoup类是最经常用的
from bs4 import BeautifulSoup
import bs4
Beautiful Soup库解析器
python对大小写比较敏感
BeautifulSoup对应一个HTML/XML文档的全部内容
soup = BeautifulSoup("<html >data< /html>", "html.parser")
解释器 | 使用方法 | 条件 |
---|---|---|
bs4的HTML解析器 | BeautifulSoup( mk, ‘html.parser’) | pip install beautifulsoup4 |
lxml的HTML解析器 | BeautifulSoup(mk, ‘lxml’) | pip install lxml |
lxml的XML解析器 | BeautifulSoup(mk, ‘xml’ ) | pip install lxml |
html5lib的解析器 | BeautifulSoup( mk, ‘html5lib’) | pip install html5lib |
Beautiful Soup类的基本元素
例子
以下例子都由w3school源代码为例子
tag标签
任何存在于HTML语法中的标签都可以用soup.<tag>访问获得
当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</ >标明开头和结尾 |
tag的name(名字)
每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型
还可以通过parent获取当前标签的父标签
基本元素 | 说明 |
---|---|
Name | 标签的名字,<p>…</p>的名字是’p‘,格式:<tag>.name |
tag的Attributes(属性)
一个<tag>可以有0或多个属性,字典类型
基本元素 | 说明 |
---|---|
Attributes | 标签的属性,字典形式组织,格式:<tag>.attrs |
Tag的NavigableString(内容)
NavigableString可以跨越多个层次
基本元素 | 说明 |
---|---|
NavigableString | 标签内非属性字符串,<>…</ >中字符串,格式:<tag>.string |
Tag的Comment(注释)
Comment是一种特殊类型
基本元素 | 说明 |
---|---|
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
基于bs4库的HTML内容遍历方法
HTML的遍历一共三种方法:下行遍历、上行遍历、平行遍历
HTML基本格式:< >…</ >构成了所属关系,形成了标签的树形结构
下行遍历
BeautifulSoup类型是标签树的根节点
属性 | 说明 |
---|---|
.contents | 子节点的列表,将<tag>所有儿子节点存入列表 |
.children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
使用时他会自动在每个标签后面加一个换行符,第二个命令就是输出行数,实际代码行数为37减去第一行的换行除以二实际一共18行代码
使用contents属性将本标签内的所有代码存入列表,可以控制输出哪一行
遍历儿子节点
for child in soup.body.children:
print(child)
遍历子孙节点
for child in soup.body.descendants:
print(child)
上行遍历
属性 | 说明 |
---|---|
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
下边的“h1”取整个网页第一个“h1”,使用parent属性就是“h1”的父亲标签包含的所有内容,第二行代码的soup本身等级就已经是最大的(整个html文件),他的父亲就是个空
使用parents属性遍历HTML中一个标签的父标签的名字,其中需要判断父标签是否为空,当为空时结束
for parent in soup.li.parents:
if parent is None:
print(parent)
else:
print(parent.name)
平行遍历
属性 | 说明 |
---|---|
.next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
平行遍历发生在同一个父节点下的各节点间,下面代码中由于每个标签后都很了一个换行符,所以使用一个next_sibling属性时出现的是换行符,在加一个next_sibling就会显示本标签的下一个平行节点标签
同理previous_sibling属性返回本标签的上一个平行标签也是和上面的说法一样
遍历后续节点,next_siblings
for sibling in soup.a.next_siblings:
print(sibling)
遍历前续节点,previous_siblings
for sibling in soup.p.previous_siblings:
print(sibling)
基于bs4库的HTML格式输出
每当我们将整个网页的代码显示出来时,代码乱七八糟的,都是在一行里显示出来全部代码,下面的代码还不是多行,由于电脑屏幕问题他给你挤压到多行
prettify()
我们可以使用prettify()方法将代码整洁的输出到屏幕上,使用后每个标签占用一行(不是一对标签),一段文字占一行,从下图看原本的130行被搞成了858行…
.prettify( )为HTML文本<>及其内容增加’\n’
.prettify( )可用于标签,方法:<tag>.prettify( )
bs4库的编码
bs4库将任何HTML输入都变成utf-8编码
Python 3.x默认支持编码是utf-8,解析无障碍
以上均为个人学习笔记,如有错误请指正,共同学习,谢谢。