python网络爬虫学习——BeautifulSoup库

参考资料:python网络爬虫技术与应用【邓维】

        beautifulsoup是python的一个HTML或XML的及解析库,可以方便地从网页中提取数据。

        beautifulsoup把HTML解析为对象进行处理,将全部页面转变为字典或者数组,相当于正则表达式的方式,能够大大简化处理过程。

# 导入库
from bs4 import BeautifulSoup
import urllib.request
# 创建实例,以百度为例
url="http://www.baidu.com"
# 打开和浏览URL中的内容
resp=urllib.request.urlopen(url)
# 返回html对象
html=resp.read()
# 创建对象
bs=BeautifulSoup(html)
# 格式化输出该内容
print(bs.prettify())

1、节点选择器

        直接调用节点的名称就能够选择节点元素。调用string属性就能得到节点内的文本。假如单个节点的结构层次十分清晰,就能够选用这类方式来解析。

html="""
<html><head><title>TheDormouse'sstory</title></head>
<body>
<p class="title"name="dromouse"><b>TheDormouse'sstory</b></p>
<p class="story">Onceuponatimetherewerethreelittlesisters;andtheirnameswere
<a href="http://example.com/else" 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>;
andtheylivedatthebottomofawell.</p>
<p class="story">...</p>
"""

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxml")# 使用lxml解析器
print(soup.title) # 输出soup对象的title
print(type(soup.title)) 
print(soup.title.string) # 输出title的内容
print(soup.head)
print(soup.p)

2、提取信息

        (1)获得名称。利用name属性获得节点的名称

        (2)获得属性。选择一个节点元素后,能够通过调用attrs获得全部属性。

# 输出节点名称
print(soup.title.name)
# 输出p节点的全部属性
print(soup.p.attrs)
# 输出p节点name属性对应的值
print(soup.p.attrs["name"])
print(soup.p["name"])

        (3)获得内容

        利用string属性获得节点元素包含的文本内容。

print(soup.p.string)

        (4)嵌套选择

html2="""
<html><head><title>TheDormouse'sstory</title></head>
<body>
"""
from bs4 import BeautifulSoup
# 创建对象
soup=BeautifulSoup(html,"lxml")
# 返回的时候<title>对象内容</title>
print(soup.head.title)
# 返回对象类型
print(type(soup.head.title))
# 返回标题内容
print(soup.head.title.string)

3、关联选择

        在做选择的时候,有时候不能做到一步就选到想要的节点元素,需要先选中某个节点元素,而后以它为基准再选择它的子节点、父节点、兄弟节点等。

        (1)父节点和祖先节点。要获得某个节点元素的父节点,可以调用parent属性。

html="""
<html><head>
<title>TheDormouse'sstory</title>
</head>
<body>
<p class="story">
Once up on a time there were three little sisters,and their names were
<a href="http://example.com/elsie" class="sister" id="link1">
<span>E1sie</span>
</a><./p>
<p class="story">...</p>
"""

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxml")
print(soup.a.parent)

        (2)兄弟节点。获得同级的节点用next_sibling和previous_sibling

html="""
<html><head>
<title>TheDormouse'sstory</title>
</head>
<body>
<p class="story">
Once up on a time there were three little sisters,and their names were
<a href="http://example.com/elsie" class="sister" id="link1">
<span>E1sie</span>
</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>
andtheylivedatthebottomofawell
</p>
"""
# 导入库
from bs4 import BeautifulSoup
# 添加lxml解析器
soup=BeautifulSoup(html,"lxml")
print("NextSibling",soup.a.next_sibling)
print("PrevSibling",soup.a.previous_sibling)
print("NextSiblings",list(enumerate(soup.a.next_siblings)))
print("PrevSiblings",list(enumerate(soup.a.previous_siblings)))

4、提取信息

html="""
<html><head>
<title>TheDormouse'sstory</title>
</head>
<body>
<p class="story">
Once up on a time there were three little sisters,and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Bob</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
</p>
"""
# 导入库
from bs4 import BeautifulSoup
# 添加lxml解析器
soup=BeautifulSoup(html,"lxml")
print("NextSibling:")
print(type(soup.a.next_sibling))
print(soup.a.next_sibling)
print(soup.a.next_sibling.string)
print("Parent:")
print(type(soup.a.parents))
print(list(soup.a.parents)[0])
print(list(soup.a.parents)[0].attrs["class"])

        如果返回结果是单个节点,那么能够直接调用string、attrs等属性获得其文本和属性;假如返回结果是多个节点的生成器,则能够转为列表后取出某个元素,再调用string、attrs等属性取得对应节点的文本和属性。

find_all()用于查询全部符合条件的元素。如下

html="""
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="listlist-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
"""

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxml")
# 输出find_all查询name
print(soup.find_all(name="ul"))
print(type(soup.find_all(name="ul")[0]))

        本例调用find_all()方法,传入name参数,其参数值为ul。也就是说想要查询全部ul节点,返回结果是列表类型,每个元素仍然是bs4.element.Tag类型。

5、解析本地网页

        运用import从bs4中导入BeautifulSoup库,利用open函数打开存放在本地的网页文件所在位置,随后使用BeautifulSoup解析网页,解析完毕打印相应的网页数据。

from bs4 import BeautifulSoup
with open("fff.html",encoding="utf-8")as web_data:
    soup=BeautifulSoup(web_data.read(),"lxml")
    print(soup.title)

6、解析在线网页

        解析在线网页时,首先把在线网页的数据请求至本地,之后再进行解析。因而,除导入BeautifulSoup模块之外,还要导入网页请求模块requests。

# 导入库
from bs4 import BeautifulSoup
import requests
url="https://cn.tripadvisor.com/Attractions-g60763-Activities-New_York_City_New_York.html"
# 引入URL地址
web_data=requests.get(url)
# 创建beautifulsoup对象
soup=BeautifulSoup(web_data,"html")
# 输出对象内容
print(soup)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/597230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript练习

1.冒泡排序 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

设备树与/sys/bus/platform/devices与/sys/devices目录关系

设备树与sys/bus/platform/devices sysfs文件系统中/sys/bus/platform/devices下的设备是由设备树生成&#xff0c; 根节点下有compatible的子节点都会在/bus/platform/devices生成节点 总线 I2C、SPI 等控制器会在/bus/platform/devices生成节点 总线 I2C、SPI 节点下的子节点…

ESP8266做主机 手机网络助手为从机

ATCIFSR查看地址&#xff0c;一般ESP8266 为192.168.4.1 在手机上下载网络调试助手&#xff0c;打开TCP客户端 创建后192.168.4.1 端口8089然后连接ESP8266热点。 ESP向手机发数据前先发送要发几个数据ATCIPSEND0,8表示发8个&#xff0c;然后再发8个数 上面创建好热点后&…

多组间比较散点图+误差棒(自备)

目录 数据 计算四分位值 作图 数据 rm(list ls()) library(ggplot2) library(dplyr) library(ggpubr) library(reshape2) library(tidyverse)data <- iris##鸢尾花数据集 dat <- data[,c(5,1)]#单个数据进行分析 计算四分位值 #根据分组计算四分位及中位数 dat1 …

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

短信清空了!华为手机短信删除了怎么恢复?

“有没有人知道这是怎么回事呀&#xff0c;原先有一千多条未读一直放着没管&#xff0c;昨天根本没打开短信这个软件&#xff0c;今晚突然发现只剩一条了&#xff0c;是华为手机自动清理了吗&#xff01;到底该怎么恢复呀&#xff1f;我真崩溃&#xff01;” 在日常生活中&…

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…

Vitis HLS 学习笔记--AXI_STREAM_TO_MASTER

目录 1. 简介 2. 示例 2.1 示例功能介绍 2.2 示例代码 2.3 顶层函数解释 2.4 综合报告&#xff08;HW Interfaces&#xff09; 2.5 关于TKEEP和TSTRB 2.6 综合报告&#xff08;SW I/O Information&#xff09; 3. 总结 1. 简介 本文通过“<Examples>/Interface…

pandas入门

pandas入门 一、pandas简介1.1 pandas介绍1.2 pandas的基本功能 二、pandas快速入门2.1 读取数据2.2 验证数据2.3 建立索引2.4 数据抽取2.4.1 选择列2.4.2 选择行2.4.3 指定行和列 2.5 排序2.6 分组聚合2.7 数据转置2.8 增加列2.9 统计分析 一、pandas简介 1.1 pandas介绍 pa…

Qt QInputDialog详解

1.简介 QInputDialog是一个对话框类&#xff0c;用于从用户那里获取一个单一的值。这个值可以是字符串、数字、或者一个列表中的选项。QInputDialog提供了一个方便的方式来快速创建一个输入对话框&#xff0c;无需自己从头开始构建。 QInputDialog支持多种输入类型&#xff1…

【备战蓝桥杯】第十四届蓝桥杯省赛C/C++ B组真题及题解

参加了两届蓝桥杯以及做过了往年的真题我的直观感受是蓝桥杯不再那么“暴力”了&#xff0c;而是逐渐趋向DP和搜素图论方面了。下面是第十四届蓝桥杯省赛C/C B组真题及题解&#xff0c;希望对阅读的你有所帮助。 目录 题目试题A&#xff1a;日期统计试题B&#xff1a;01 串的熵…

Redis学习3——Redis应用之缓存

引言 缓存的意义 Redis作为一个NoSql数据库&#xff0c;被广泛的当作缓存数据库使用&#xff0c;所谓缓存&#xff0c;就是数据交换的缓冲区。使用缓存的具体原因有&#xff1a; 缓存数据存储于代码中&#xff0c;而代码运行在内存中&#xff0c;内存的读写性能远高于磁盘&a…

前后端功能实现——查询所有

目录 1、需求 2、步骤 1&#xff09;创建模块 引入坐标 2&#xff09;创建结构 实现三层架构 3&#xff09;创建表 brand 4&#xff09;创建实体类 Brand 5&#xff09;创建MyBatis配置文件 6&#xff09;创建映射文件 7&#xff09;创建工具类 SqlSessionFactoryUti…

基于FPGA的数字信号处理(9)--定点数据的两种溢出处理模式:饱和(Saturate)和绕回(Wrap)

1、前言 在逻辑设计中&#xff0c;为了保证运算结果的正确性&#xff0c;常常需要对结果的位宽进行扩展。比如2个3bits的无符号数相加&#xff0c;只有将结果设定为4bits&#xff0c;才能保证结果一定是正确的。不然&#xff0c;某些情况如77 14(1110)&#xff0c;如果结果只…

部署YUM仓库以及NFS共享服务

YUM仓库部署 一.YUM概述 YUM仓库源是一种软件包管理工具&#xff0c;用于在Linux系统上安装、更新和删除软件包。YUM仓库源包含了软件包的元数据信息和实际的软件包文件。用户可以通过配置YUM仓库源&#xff0c;从中下载和安装软件包。 常见的YUM仓库源包括&#xff1a; 本…

【一起深度吧!】24/05/03

池化层 最大池化和平均层化&#xff1a;最大池化&#xff1a;平均池化&#xff1a; 从零实现池化层&#xff1a; 最大池化和平均层化&#xff1a; 池化的作用: 1、可以降维&#xff0c;减少要 训练的参数。 2、提取特征&#xff0c;也就是保留主要的特征&#xff0c;过滤掉不重…

7-zip下载、安装

7-Zip 官方中文网站 (sparanoid.com) 7-Zip - 程序下载 (sparanoid.com)

Unity 性能优化之图片优化(八)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、可以提前和美术商量的事1.避免内存浪费&#xff08;UI图片&#xff0c;不是贴图&#xff09;2.提升图片性能 二、图片优化1.图片Max Size修改&#x…

Eayswoole 报错 crontab info is abnormal

在执行一个指定的定时任务时 如 php easyswoole crontab show 报错 crontab info is abnormal 如下图所示&#xff1a; 查询了半天 修改了如下配置&#xff1a; 旧的 // 创建定时任务实例 $crontab new \EasySwoole\Crontab\Crontab($crontabConfig); 修改后&#…

山海鲸医疗科技:引领智慧医疗新潮流

随着科技的飞速发展&#xff0c;智慧医疗已经成为医疗行业创新的重要方向。在这个背景下&#xff0c;山海鲸智慧医疗解决方案应运而生&#xff0c;以其先进的技术和全面的服务&#xff0c;为医疗行业带来了前所未有的变革。 山海鲸智慧医疗解决方案是一套集成医疗信息化、大数…