介绍
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式
安装
pip install bs4
基本信息
import bs4
print(bs4.__license__)
print(bs4.__version__)
print(bs4.__copyright__)
print(bs4.__author__)
print(bs4.__all__)
输出
MIT
4.7.1
Copyright (c) 2004-2019 Leonard Richardson
Leonard Richardson (leonardr@segfault.org)
['BeautifulSoup']
基本应用
import bs4
from bs4 import BeautifulSoup
import requests
try:
url = 'http://qlwb.com.cn/'
r = requests.get(url=url)
r.encoding = r.apparent_encoding
# 用BeautifulSoup解析文本
bs = BeautifulSoup(r.content, 'lxml')
# file = open(file="../file/html.txt", mode='w+')
# 按照标准的缩进格式的结构输出
# file.write(str(bs.prettify()))
# 获取html中的title标签
print(bs.title)
# 获取html标题名称
print(bs.title.name)
# 获取html标题内容
print(bs.title.string)
# 获取html所在父节点标签名称
print(bs.title.parent.name)
# 获取html中的所有link
a = bs.find_all('link')
for i in a:
print(i)
# 输出获取的link的href属性
for i in a:
print(i.get('href'))
# 获取html第一条的meta,并输出其content内容
b = bs.meta
print(b['content'])
# 从文档中获取所有文字内容:
# print(bs.get_text())
except Exception as e:
print(e)
输出
<title>齐鲁晚报网-山东新闻门户 传播品质资讯</title>
title
齐鲁晚报网-山东新闻门户 传播品质资讯
head
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/index-szb.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/search.css" rel="stylesheet" type="text/css"/>
https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css
https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css
https://img.qlwb.com.cn/templates/qlwb/css/2017shou/index-szb.css
https://img.qlwb.com.cn/templates/qlwb/css/2017shou/search.css
text/html; charset=utf-8
对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .
源代码
import bs4
from bs4 import BeautifulSoup
html_doc = """
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>
齐鲁晚报网-山东新闻门户 传播品质资讯
</title>
<meta content="齐鲁晚报,生活日报,鲁南商报,山东新闻,济南新闻,滚动新闻,齐鲁晚报论坛,网上报料,拍客,微博齐鲁" name="keywords"/>
<meta content="”no-transform”" http-equiv="”Cache-Control”"/>
<meta content="YSz04dmCHI" name="baidu-site-verification"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css" rel="stylesheet" type="text/css"/>/
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/index-szb.css" rel="stylesheet" type="text/css"/>
</head>
"""
# 解析文档
bs = bs4.BeautifulSoup(html_doc, 'lxml')
# 将title赋值给tag
tag = bs.title
# tag类型
print(type(tag))
# 每个tag都有自己的名字,通过 .name 来获取:
print(tag.name)
# 修改tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档:
tag.name = 'TITLE'
print(tag)
# tag的属性的操作方法与字典相同
tag1 = bs.meta
print(tag1['content'])
# 通过.attrs获取属性字典
print(tag1.attrs)
# 添加,删除或修改tag属性
tag1['content'] = 'charset=utf-8'
print(tag1)
del tag1['http-equiv']
print(tag1.get('http-equiv'))
# 遍历标签内的字符串
print(tag.string)
# NavigableString 来包装tag中的字符串
print(type(tag.string))
# BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name
print(bs.name)
# 获取head下第一个meta标签
print(bs.head.meta)
# tag的 .contents 属性可以将tag的子节点以列表的方式输出:
tag2 = bs.head
print(tag2.contents)
# BeautifulSoup 对象本身一定会包含子节点,也就是说<html>标签也是 BeautifulSoup 对象的子节点
# 字符串没有 .contents 属性,因为字符串没有子节点:
# 通过tag的 .children 生成器,可以对tag的子节点进行循环:
for i in tag2.children:
print(i)
# .contents 和 .children 属性仅包含tag的直接子节点
# .descendants 属性可以对所有tag的子孙节点进行递归循环
for i in tag2.descendants:
print(i)
# 如果tag中包含多个字符串 [2] ,可以使用 .strings 来循环获取:
for i in tag.strings:
print(i)
# 输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容:
输出
<class 'bs4.element.Tag'>
title
<TITLE>
齐鲁晚报网-山东新闻门户 传播品质资讯
</TITLE>
text/html; charset=utf-8
{'content': 'text/html; charset=utf-8', 'http-equiv': 'Content-Type'}
<meta content="charset=utf-8" http-equiv="Content-Type"/>
None
齐鲁晚报网-山东新闻门户 传播品质资讯
<class 'bs4.element.NavigableString'>
[document]
<meta content="charset=utf-8"/>
['\n', <meta content="charset=utf-8"/>, '\n', <TITLE>
齐鲁晚报网-山东新闻门户 传播品质资讯
</TITLE>, '\n', <meta content="齐鲁晚报,生活日报,鲁南商报,山东新闻,济南新闻,滚动新闻,齐鲁晚报论坛,网上报料,拍客,微博齐鲁" name="keywords"/>, '\n', <meta content="”no-transform”" http-equiv="”Cache-Control”"/>, '\n', <meta content="YSz04dmCHI" name="baidu-site-verification"/>, '\n', <link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css" rel="stylesheet" type="text/css"/>, '\n', <link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css" rel="stylesheet" type="text/css"/>]
<meta content="charset=utf-8"/>
<TITLE>
齐鲁晚报网-山东新闻门户 传播品质资讯
</TITLE>
<meta content="齐鲁晚报,生活日报,鲁南商报,山东新闻,济南新闻,滚动新闻,齐鲁晚报论坛,网上报料,拍客,微博齐鲁" name="keywords"/>
<meta content="”no-transform”" http-equiv="”Cache-Control”"/>
<meta content="YSz04dmCHI" name="baidu-site-verification"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css" rel="stylesheet" type="text/css"/>
<meta content="charset=utf-8"/>
<TITLE>
齐鲁晚报网-山东新闻门户 传播品质资讯
</TITLE>
齐鲁晚报网-山东新闻门户 传播品质资讯
<meta content="齐鲁晚报,生活日报,鲁南商报,山东新闻,济南新闻,滚动新闻,齐鲁晚报论坛,网上报料,拍客,微博齐鲁" name="keywords"/>
<meta content="”no-transform”" http-equiv="”Cache-Control”"/>
<meta content="YSz04dmCHI" name="baidu-site-verification"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/qlwb.css" rel="stylesheet" type="text/css"/>
<link href="https://img.qlwb.com.cn/templates/qlwb/css/2017shou/ad.css" rel="stylesheet" type="text/css"/>
齐鲁晚报网-山东新闻门户 传播品质资讯