首页 > 其他分享 >BeautifulSoup库/bs4 基础&深入 技术干货

BeautifulSoup库/bs4 基础&深入 技术干货

时间:2023-04-20 17:41:21浏览次数:39  
标签:bs4 元素 tag BeautifulSoup find soup 干货 节点


BeautifulSoup库的安装

pip install bs4

对HTML的装载,prettify()即表示整理,能清晰的显示文档结构(文档数)

soup  = BeautifulSoup(doc,"lxml")
 s = soup.prettify()
 print("s")

如果HTML缺失缺失,beautifulsoup库会自动补缺。

BeautifulSoup查找文档元素

获取网页html代码以后,那么我们要把它装在在一个beautifulsoup的对象当中,那么如何在文档中找到目标元素

  1. 如何查找html元素
    利用find_all()函数,其原型为:
find_all(self,name = None, attrs = {},
recursive = True, text = None, 
limit = None,**kwargs)

元素

含义

self

类成员函数

name

要查找的tag元素名称,默认是None,如果不提供,就是查找所有的元素

attrs

是元素的属性,字典,默认是空,如果提供就是查找有这个指定属性的元素

find_all函数是查找所有满足要求的元素节点,如果只查找一个元素节点就可以使用find()函数

find(self, name = None, attrs = {}, 
recursive = True,text = None,
 limit = None, **kwargs)

其使用方法与find_all类似,不同的是它只返回第一个满足要求的节点,不是一个列表。

示例:查找文档中class="title"的< p >元素

from bs4 import BeautifulSoup
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 uopn a time ther were three little sisters;and their names were
<a href="http://example.com/elsie"class="sister"
id="link1"elsie</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 an the bottom of a well.
</p>
<p class="story">...</p>
</body>
</html>

'''

利用find()函数

soup = BeautifulSoup(doc,"lxml")
tag = soup.find_all("p", attrs = {"class":"title"})
print(tag)
#result:<p class="title"><b>the Dormouse's story</b></p>

因为这条目标信息因为其位置在最前面,所以用find()同样也能找到。

soup = BeautifulSoup(doc,"lxml")
tags = soup.find_all(name = None, attrs = {"class":"sister"})
for tag in tags:
    print(tag)
#result:
<a class="sister" elsie="" href="http://example.com/elsie" id="link1">,
</a>
<a class="sister" href="http://example.com/lacie" id="link2">lacie</a>
<a class="sister" href="http://example.com/tillie" id="link3">tillie</a>

对于这个文档同样可以使用:

tags = soup.find_all("a")
tags_1 = soup.find_all("a",attrs = {"class","sister"})
print(tags)
print("\n",tags_1)
#result:
[<a class="sister" elsie="" href="http://example.com/elsie" id="link1">,
</a>, <a class="sister" href="http://example.com/lacie" id="link2">lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">tillie</a>]

 [<a class="sister" elsie="" href="http://example.com/elsie" id="link1">,
</a>, <a class="sister" href="http://example.com/lacie" id="link2">lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">tillie</a>]

两者效果一致

BeautifulSoup获取元素的属性值

如果一个元素已经找到,例如找到< a >元素,则可以通过tag[attrName]来获取tag元素的名称为attrName的属性值,其中tag是一个bs4.element.Tag对象。
例如:查找文档中所有的超链接地址

soup = BeautifulSoup(doc,"lxml")
tags = soup.find_all("a")
for tag in tags:
    print(tag["href"])
 #result:
 http://example.com/elsie
http://example.com/lacie
http://example.com/tillie

BeautifulSoup获取元素包含的文本值

使用方法:tag,text来获取tag元素包含的文本值,其中tag是一个bs4.element.Tag对象。
例如:查找文本中所有< a >超级链接包含的文本值

soup = BeautifulSoup(doc,"lxml")
tags = soup.find_all("a")
for tag in tags:
    print(tag.text)
#result:
,

lacie
tillie

tag.text获取的结果为一个标签下的所有文本

BeautifulSoup的高级查找

一般find或者find_all都能满足我们的需要,如果还不能,则可以设计一个查找函数来进行查找。

def mefilter(tag):
    print(tag.name)
    return(tag.name == "a" and tag.has_attr("href")and tag["href"]=="http://example.com/lacie")

soup = BeautifulSoup(doc,"lxml")
tag = soup.find_all(mefilter)
print("tag")
#result:
html
head
title
body
p
b
p
a
a
a
p
tag

说明:程序的运行中定义了一个筛选函数myfilter(tag)它的参数是tag对象,在调用soup.find_all(myfilter)时候会把每个tag元素传递给myfilter函数,返回True则取,否则就丢弃。

BeautifulSoup查找文档元素

高级查找要注意“class”标签为列表结构

def mefilter(tag):
    if tag.name == "p" and tag["class"] =="story":
        return True
soup = BeautifulSoup(doc,"html.parser")
tags = soup.find_all(mefilter)
print(tags)

def mefilter(tag):
    if tag.name == "p" and tag["class"] == ["story"]:
        return True
soup = BeautifulSoup(doc,"html.parser")
tags = soup.find_all(mefilter)
print("\n",tags)
#result:
[]

 [<p class="story">
once uopn a time ther were three little sisters;and their names were
<a a="" class="sister" elsie<="" href="http://example.com/elsie" id="link1">,
<a class="sister" href="http://example.com/lacie" id="link2">lacie</a>and
<a class="sister" href="http://example.com/tillie" id="link3">tillie</a>;
and they lived an the bottom of a well.
</a></p>, <p class="story">...</p>]

tag[“class”]是一个很特殊的属性
倘若文本为< p class=“story exem”>,那么就应该写为:

tag["class"] == ["story","exem"]

BeautifulSoup遍历文档元素

获取元素节点的父节点、子节点、临近节点,所有子孙节点,兄弟节点

目的

操作

获取父节点

tag.parent

获取元素的直接子节点

tag.children

获取tag节点的所有子孙节点元素,包括element,text等类型的节点

tag.desendants

下一个兄弟节点

tag.next_sibling

前一个兄弟节点

tag.previous_sibling

#eg_1
soup = BeautifulSoup(doc,"lxml")
print(soup.name)
tag = soup.find("b")
while tag:
	print(tag.name)
	tag = tag.parent
#eg_2
suop = BeautifulSoup(doc,"lxml")
tag = soup.find("b")
print(tag.previous_sibling)

BeautifulSoup使用CSS语法查找元素
其除了自身的函数,还可以用CSS语法
CSS语法
tag.select(css)
其结构为:
[tagName][attName[=value]]
其中[…]部分是可选的

变量

含义

tagName

元素名称,没有指定就是所有元素

attName = value

属性名称,value是它对应的值

tag.select(css)

返回一个bs4.element.Tag的列表,可能只有一个元素

各种应用具体操作方法

目标

代码

soup.select(“p a”)

查找文档中所有< p >节点下的所有< a >节点

soup.select(“p[class=‘story’] a”)

查找文档中所有属性class="story"的< p >节点下的所有< a >元素节点

soup.select(“p[class] a”)

查找文档中所有具有class属性的< p >< a >元素节点

soup.select(“body head title”)

查找下面< head >的< title >节点

soup.select(“body[class]”)

查找< body >下面所有具有class属性的节点

soup.select(“body[class] a”)

查找< body >下面所有具有class属性的节点下面的< a >节点

soup.select(“a[id=‘link1’]”)

查找属性id="link1"的< a >节点

属性的语法规则

选择器

描述

[attName]

用于选取带有指定属性的元素

[attName-value]

用于选取带有指定属性的元素

attName^=value]

匹配属性值以指定值开头的每个元素

[attName$=value]

匹配属性值以指定结尾的每个元素

[attName*=value]

匹配属性中包含指定值的每个元素

#查找所有< div >节点下面的所有直接子节点< p >
#不包含孙节点
#注意 p左右有空格
soup.select("div > p")


标签:bs4,元素,tag,BeautifulSoup,find,soup,干货,节点
From: https://blog.51cto.com/guog/6210012

相关文章

  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库
    金融行业数字化转型浪潮来袭,客户需求也正加速向在线金融服务转移。金融机构想要实现现代化改造技术堆栈,为客户提供实时交互、欺诈检测等一系列个性化创新服务,就必须重视遗留系统和传统数据库架构“老年病”问题!面对数字化颠覆带来的挑战和压力,接受变化是关键!一些极力打破传统束......
  • #yyds干货盘点# LeetCode面试题:搜索旋转排序数组 II
    1.简述:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2......
  • #yyds干货盘点#详解Django基础
    一:创建项目使用django-admin命令构建项目django-adminstartprojectHelloWorld如上使用django构建了一个HelloWorld项目二:项目结构我们可以看到HelloWorld项目结构如下|--HelloWorld||--__init__.py||--settings.py||--urls.py|`--wsgi.py`--manage.p......
  • #yyds干货盘点# LeetCode程序员面试金典:串联所有单词的子串
    题目:给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串长度相同。 s 中的串联子串是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words=["ab","cd","ef"],那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd",......
  • #yyds干货盘点# LeetCode程序员面试金典:两数相除
    题目:给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345将被截断为8,-2.7335将被截断至-2。返回被除数 dividend 除以除数 divisor 得到的商。注意:假设我们的......
  • #yyds干货盘点# LeetCode面试题:删除有序数组中的重复项 II
    1.简述:给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数......
  • # yyds干货盘点 # Pandas另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【eric】问了一个Pandas的问题,这里拿出来给大家分享下。另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?我看start_col=1的时候,A列还是存在,只不过内容......
  • 星起航跨境:亚马逊跨境电商干货分享,有效增加产品曝光的方法
    相信各位亚马逊卖家都遇到过产品曝光量低的问题,很多时候还会因为曝光量低导致销量不理想。那么,卖家应该如何有效提高产品的曝光量呢?星起航在此分享几个有效提高产品曝光量的方法。1、优化产品的标题和描述产品的标题和描述是卖家的产品在亚马逊上给消费者的第一印象,也是消费者在购......
  • #yyds干货盘点#python关键字参数
    关键字参数kwarg=value 形式的 关键字参数 也可以用于调用函数。函数示例如下:defparrot(voltage,state='astiff',action='voom',type='NorwegianBlue'):print("--Thisparrotwouldn't",action,end='')print("ifyouput......
  • #yyds干货盘点#python循环中的 break、continue 语句及 else 子句
    break 语句和C中的类似,用于跳出最近的 for 或 while 循环。循环语句支持 else 子句;for 循环中,可迭代对象中的元素全部循环完毕,或 while 循环的条件为假时,执行该子句;break 语句终止循环时,不执行该子句。请看下面这个查找素数的循环示例:>>>forninrange(2,10):.........