beautifulsoup

beautifulsoup

beautifulsoup的简单使用

Beautiful Soup 是 python的一个库, 最主要的功能是从网页抓取数据。官方解释如下:
Beautiful Soup 提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱, 通过解析文档为用户提供需要抓取的数据, 因为简单, 所以不需要多少代码就可以写出一个完整的应用程序

安装

pip install beautifulsoup4

解析器

Beautiful Soup 支持Python标准库中的HTML解析器, 还支持一些第三方的解析器, 如果我们不安装它, 则Python会使用默认的解析器, lxml解析器更加强大,推荐安装

pip install lxml

解析器对比

文章: https://beautifulsoup.readthedocs.io/zh-cn/latest/


子节点

一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup 提供了许多操作和遍历子节点的属性
注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点。

.contents

tag的 .contents 属性可以将tag的子节点以列表的方式输出:

head_tag = soup.head
head_tag
# <head><title>hello world</title></head>


head_tag.contents
[<title>hello world</title>]

title_tag = head_tag.contents[0]
title_tag
# <title>hello world</title>
title_tag.contents
# [u'hello world']

节点内容

.string

如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点。如果一个tag仅有一个子节点, 那么这个tag也可以使用.string 方法, 输出结果与当前唯一子节点的.string结果相同。
通俗来说: 如果一个标签里面没有标签了, 那么 .string 就会返回标签里面的内容。如果标签里面只有唯一的一个标签了, 那么 .string 也会返回最里面的内容。

.text

如果tag包含了多个子节点, text则会返回内部所有文本内容
注意:
strings和text都可以返回所有文本内容
区别: text返回内容为字符串类型 strings为生成器generator

多个内容

.strings
.stripped_strings

.strings

获取多个内容,不过需要遍历获取。

.stripped_strings

输出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白内容


父节点

.parent

通过.parent属性来获取某个元素的父节点.
文档的顶层节点比如的父节点是 BeautifulSoup 对象:

from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html','r', encoding='UTF-8'), 'lxml')
print(soup.find('html').parent)
print(soup.find('div').parent)

beautifulsoup的搜索文档树

find_all()函数
原型

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

功能

搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

测试
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html', 'r', encoding='UTF8'), 'lxml')

print(soup.find_all('div'))     #find_all得到的永远是一个列表对象
for i in soup.find_all('div',limit=2):
    print(i.text)

print(soup.find_all('input',id="username")) #加上一些过滤条件

print(soup.input['id'])
find()函数

相当于find_all( , limit=1)

from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html','r', encoding='UTF-8'), 'lxml')

print(soup.find('div').stripped_strings)    #拿到的是迭代器对象
for i in soup.find('div').stripped_strings:
    print(i)

print(soup.find('div',class_="container"))  #可以加一些过滤条件
print(soup.find('div',id="side-nav"))

beautifulsoup的css选择器

我们在写CSS时, 标签名不加任何修饰, 类名前加点, id名前加#, 在这里我们也可以利用类似的方法来筛选元素, 用到的方法是soup.select(),返回类型是list

通过标签名查找

print(soup.select(‘a’))
print(soup.select(‘div’))

通过类属性查找

print(soup.select('.color-gray))
print(soup.select(‘ul[class=“cover-col-4 clearfix”]’))

通过id属性查找

print(soup.select(‘#db-global-nav’))

查找既有class也有id选择器的标签

soup.select(“.story#test”)

查找有多个class选择器的标签

soup.select(“.story.test”)

查找有多个class选择器和id选择器的标签

soup.select(“.story.test#book”)

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linux-hzh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值