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

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

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

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']) 

打印结果:


相关推荐

JavaScript中常用数据类型,你知道几个?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScr...

踩坑:前端的z-index 之bug一二(zh1es前端)

IE6下浮动元素bug给IE6下的一个div设置元素样式,无论z-index设置多高都不起作用。这种情况发生的条件有三个:1.父标签position属性为relative;2.问题标签无posi...

两栏布局、左边定宽200px、右边自适应如何实现?

一、两栏布局(左定宽,右自动)1.float+margin即固定宽度元素设置float属性为left,自适应元素设置margin属性,margin-left应>=定宽元素宽度。举例:HTM...

前端代码需要这样优化才是一个标准的网站

  网站由前端和后端组成,前端呈现给用户。本文将告诉您前端页面代码的优化,当然仍然是基于seo优化的。  就前端而言,如果做伪静态处理,基本上是普通的html代码,正常情况下,这些页面内容是通过页面模...

网页设计如何自学(初学网页设计)

1在Dreamweaver中搭建不同的页面,需要掌握HTML的语句了,通过调整各项数值就可以制作出排版漂亮的页面,跟着就可以学习一些可视化设计软件。下面介绍网页设计如何自学,希望可以帮助到各位。Dre...

1、数值类型(数值类型有)

1.1数据类型概览MySQL的数据类型可划分为三大类别:数值类型:旨在存储数字(涵盖整型、浮点型、DECIMAL等)。字符串类型:主要用于存储文本(诸如CHAR、VARCHAR之类)。日期/...

网页设计的布局属性(网页设计的布局属性是什么)

布局属性是网站设计中必不可少的一个重要的环节,主要用来设置网页的元素的布局,主要有以下属性。1、float:该属性设置元素的浮动方式,可以取none,left和right等3个值,分别表示不浮动,浮在...

Grid网格布局一种更灵活、更强大的二维布局模型!

当涉及到网页布局时,display:flex;和display:grid;是两个常用的CSS属性,它们都允许创建不同类型的布局,但有着不同的用法和适用场景。使用flex布局的痛点当我们使...

React 项目实践——创建一个聊天机器人

作者:FredrikStrandOseberg转发链接:https://www.freecodecamp.org/news/how-to-build-a-chatbot-with-react/前言...

有趣的 CSS 数学函数(css公式)

前言之前一直在玩three.js,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在CSS中也用上这些数学函数,但发现CSS目前还没有,据说以后的新规范会纳入,估计也要等很久。然...

web开发之-前端css(5)(css前端设计)

显示控制一个元素的显示方式,我们可以使用display:block;display:inline-block;display:none;其中布局相关的还有两个很重要的属性:display:flex;和...

2024最新升级–前端内功修炼 5大主流布局系统进阶(分享)

获课:keyouit.xyz/14642/1.前端布局的重要性及发展历程前端布局是网页设计和开发的核心技能之一,它决定了页面元素如何组织和呈现。从早期的静态布局到现代的响应式布局,前端布局技术经历了...

教你轻松制作自动换行的CSS布局,轻松应对不同设备!

在网页设计中,自动换行的CSS布局是非常常见的需求,特别是在响应式设计中。它可以让网页内容自动适应不同屏幕尺寸,保证用户在不同设备上都能够获得良好的浏览体验。本文将介绍几种制作自动换行的CSS布局的方...

晨光微语!一道 CSS 面试题,伴你静享知识治愈时光

当第一缕阳光温柔地爬上窗台,窗外的鸟鸣声清脆悦耳,空气中弥漫着清新的气息。在这宁静美好的清晨与上午时光,泡一杯热气腾腾的咖啡,找一个舒适的角落坐下。前端的小伙伴们,先把工作的疲惫和面试的焦虑放在一边,...

2023 年的响应式设计指南(什么是响应式设计优缺点)

大家好,我是Echa。如今,当大家考虑构建流畅的布局时,没有再写固定宽度和高度数值了。相反,小编今天构建的布局需要适用于几乎任何尺寸的设备。是不是不可思议,小编仍然看到网站遵循自适应设计模式,其中它有...