百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python爬虫:用Beautifulsoup爬取html文本数据

zhezhongyun 2025-02-20 18:46 55 浏览

Beautifulsoup介绍:

  1. 是一个高效的网页解析库,可以从HTML或XML文件中提取数据
  2. 支持不同的解析器,比如,对HTML解析,对XML解析,对HTML5解析
  3. 就是一个非常强大的工具,爬虫利器
  4. 一个灵活又方便的网页解析库,处理高效,支持多种解析器
  5. 利用它就不用编写正则表达式也能方便的实现网页信息的抓取


第一步:安装BeautifulSoup4,lxml

 pip install BeautifulSoup4
    BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库
pip install lxml
    lxml 是一种使用 Python 编写的解析库,可以迅速、灵活地处理 XML 和 HTML


第二步:导包,from bs4 import BeautifulSoup


第三步:实例化对象

html = """

    
        The Dormouse's story
    
    
        

Once upon a time there were three little sisters; and their names were Elsie Lacie and Tillie and they lived at the bottom of a well.

...

"""
soup = BeautifulSoup(html, 'lxml')  # h:要解析的内容  lxml:解析器
知识补充:print(soup.prettify())  # 代码补全


第四步:打印

一、通过标签选取,会返回包含标签本身及其里面的所有内容

# print(soup.head) # 包含head标签在内的所有内容
# print(soup.p) # 返回匹配的第一个结果

1.print(soup.head)打印结果:

The Dormouse's story

2.print(soup.p)打印结果:

The Dormouse's story


二、打印标签中间的文本内容,不包含<>

# .string是属性,作用是获取字符串文本
print(soup.html.head.title.string)
print(soup.title.string)

打印结果都为:The Dormouse's story


三、打印标签名

 .name --获取标签本身名称  
 print(soup.title.name)

打印结果为:title


四、打印属性的值

.attrs[]  --通过属性拿属性的值 
print(soup.p.attrs['name'])# 获取p标签name属性的属性值
print(soup.a.attrs['id']) # 获取p标签id属性的属性值

print(soup.a['id']) #第二种写法
print(soup.p['class']) # 以列表得形式保存
print(soup.a['href'])  # 也是只返回第一个值

1.print(soup.p.attrs['name'])打印结果:

dromouse

2.print(soup.p.attrs['id'])和print(soup.a['id'])打印结果:

link1

3.print(soup.p['class'])打印结果:

['title', 'asdas']

4.print(soup.a['href'])打印结果:

http://example.com/elsie


五、打印父标签下的所有子标签

.contents 获取标签子节点,以列表形式返回
.children 获取子节点,返回的是一个list类型的迭代器

print(soup.body.contents)  # a是p的子节点,获取P标签所有子节点内容 返回一个list
print(soup.body.children) #返回的是一个list类型的迭代器

1.print(soup.body.contents)的打印结果:

['\n',

The Dormouse's story

, '\n',

Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillie;

and they lived at the bottom of a well.

, '\n',

...

, '\n']

2.print(soup.body.children)的打印结果:


.children 获取子节点讲解

1.和for循环一起使用

for i in soup.p.children:
print(i)

打印结果:

The Dormouse's story

Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillie;

and they lived at the bottom of a well.

...


2.和enumerate()一起使用

enumerate() 
#用于将一个可遍历的数据对象,并在其前面添加一个索引序列,即同时列出数据下标值和数据,一般用在 for 循环当中
for i, child in enumerate(soup.body.children):  
    print(i, child)  #i用来接收索引,child用来接收数据

打印结果:



六、打印子孙节点

.descendants 获取子孙节点,返回的是一个生成器
用法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(h, 'lxml')
print(soup.body.descendants)  # 获取子孙节点  生成器本身是一种特殊的迭代器
for i, child in enumerate(soup.body.descendants):
    print(i, child)


七、打印父节点

.parent 获取父节点,返回的结果是某一标签的上一层级节点以及某一标签里的内容,返回的不是列表
用法:
from bs4 import Beautifulsoup
soup = Beautifulsoup(h, 'lxml')
print(soup.body.parent)

.parents 获取祖先节点,返回的结果是,返回的是生成器
用法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(h, 'lxml')
print(soup.a.parents)  # 获取祖先节点 返回的是生成器,生成器本身是一种特殊的迭代器
      
# print(list(soup.a.parents)) 
#list是内置的列表类,它有一个构造函数,可以接受一个Iterable(可迭代)的对象作为参数,返回一个列表对象

for i, child in enumerate(soup.a.parents):
    print(i, child)
返回的结果是按层级来返回,首先返回a标签的上一层级,再返回a标签的上上层级,再返回a标签的上上上层级,以此类推


八、打印兄弟节点

 .next_siblings 获取后面的兄弟节点,可以是多个兄弟节点
.previous_siblings 获取前面的兄弟节点
两者返回的都是一个生成器对象

用法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(h, 'lxml')

print(list(enumerate(soup.a.next_siblings)))  # 默认为找第一个a标签后边的所有的兄弟节点
print(list(enumerate(soup.a.previous_siblings))) # 默认为找第一个a标签前边的所有的同一层级的兄弟节点


九、find_all(),根据标签名查找

from bs4 import BeautifulSoup

soup = BeautifulSoup(h, 'lxml')

# print(soup.find_all('a'))  # 拿到所有a标签及其里面内容
# print(soup.find_all('a')[0])  # 拿到第一个a标签及其里面内容
# print(soup.find_all('p')) # 拿到所有p标签及其里面内容,包括在p标签里其他标签的内容


.string 获取标签中间的文本值
用法
from bs4 import BeautifulSoup
soup = BeautifulSoup(h, 'lxml')
for i in soup.find_all('p'):
	print(i.string)

有时候用.string取不到,可以用get_text(),get_text()可以用来获取特殊符号
用法:print(i.get_text())


十、根据属性取值,.find_all(attrs={'属性':'属性值'})

from bs4 import BeautifulSoup
soup = BeautifulSoup(h, 'lxml')
for ul in soup.find_all(attrs={'name': 'elements'}):
#     print(ul)  # 从列表中遍历取出
#     print(ul.li.string)  #只返回第一个值
#     print('-----')
    for li in ul:
#         print(li) # 都是同级标签
        print(li.string)

第二种写法:.find_all(属性='属性值')

print(soup.find_all(id='list-1'))

这种方法打印不出class属性,因为class属于Python关键字,需做特殊处理,在class后面加_


第三种写法:指定标签和属性(常用)

print(soup.find_all('li',{'class':'element'}))  
print(soup.find_all('ul',{'id':'list-2'}))

可以通过父标签.子标签['属性']来获取对应的属性值


例如获取class='element'的属性值'element',可以这样写:

classes = soup.find_all('ul',{'class':'list'})

for i in classes:

new_class = i.li['class']

print(new_class)


打印结果为:

['element']

['element']


十一、查找标签中的指定文本,text=()

print(soup.find_all(text='Foo')) # 可以做内容统计用
print(len(soup.find_all(text='Foo'))) # 统计数量

打印结果:

['Foo', 'Foo']

2


十二、find和find_all用法一样,但是也有区别

find返回单个元素,find_all返回所有元素


十三、用CSS选择器提取

CSS选择器介绍:

1,类别选择器 -- class

2,标签选择器 --

3,ID选择器 -- id

用法:
通过select()直接传入CSS选择器即可完成选择
例如:print(soup.select('ul li'))  # 提取ul选择器下的li标签

注意:
    1,用CSS选择器时,标签名不加任何修饰,class类名前加. , id名前加# 
    2,用到的方法是soup.select(),返回类型是list
    3,多个过滤条件需要用空格隔开,严格遵守从前往后逐层筛选


html='''
q321312321

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''

class类名前加.

print(soup.select('.panel'))
print("----"*10)
# 多个条件用空格隔开
print(soup.select('.panel .panel-heading')) 
print("----"*10)

打印结果:


id名前加#

print(soup.select('#list-1'))

打印结果:


可以混合使用!!

# 比如:根据id和class去找
print(soup.select('#list-1 .element'))  #从这个例子可以看出.select方法会获取满足条件的所有内容

打印结果:


十四、获取属性的值

两种写法:
ul['id']
ul.attrs['id']
具体用法:
for ul in soup.select('ul'):
#     print(ul)
#     print(ul['id'])
#     print(ul['class'])

    print(ul.attrs['id'])
    print(ul.attrs['class']) 

打印结果:


相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...