python 爬虫 入门 二、数据解析(正则、bs4、xpath)

目录

一、待匹配数据获取

二、正则

三、bs4

(一)、访问属性

(二)、获取标签的值

 (三)、查询方法

 四、xpath

后续:登录和代理


        上一节我们已经知道了如何向服务器发送请求以获得数据,今天我们就来学习如何从获得的数据中找到自己需要的东西,使用数据解析的三种工具:正则、bs4、xpath

一、待匹配数据获取

我们今天来试试国家数据网页,尝试获取下面这个框里面所有链接的url。

        我们先右键网页,查看页面源代码(ps:F12元素里面的代码是网页的实时代码,和源代码有差异。)然后Ctrl+F搜索: 2020年投入产出表,可以看到有结果,前面的超链接就是我们需要的url。这表明数据是直接在网页源码中的,而不是通过脚本二次请求服务器生成的,可以直接通过页面源码找到。

接下来,使用上一节的代码来获取页面源代码。

import requests

url = "https://data.stats.gov.cn/"
headers = {
    # 用户代理,某些网站验证用户代理,微微改一下,如果提示要验证码之类的,使用它
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
}
with requests.get(url=url, headers=headers,) as resp:
    resp.encoding = "utf-8"
    print(resp)
    with open("国家数据.html", mode="w",encoding="utf-8") as f:
        f.write(resp.text)  # 读取到网页的页面源代码"

 我们下面的操作就只读取下载的html文件,而不反复请求服务器。

二、正则

        使用正则表达式来匹配数据在很多python基础中都有,速度快,能适应复杂的需求,但是复杂的正则表达式不好写,难维护,容易出错。不过那些大语言模型写正则是一把好手。这里主要爬虫,关于正则表达式,给几个表看一看,用用就会了。这里贴一下python文档链接和几个表以待后续查看:正则表达式指南 — Python 3.11.10 文档

import re  # 正则

findall()

以列表形式返回所有满足数据,没有返回空列表

finditer()

返回所有匹配结果的迭代器,建议使用for+group提取

search()

返回第一个匹配结果的match对象,使用group提取,没有返回None

match()

从头开始匹配,返回match对象。

相当于在正则表达式前面加了^,没有返回None

compile()预加载正则表达式

量词

意义

*

0~∞次

+

1~∞次

?

0~1次

{n}

n次

{n,}

n~∞次

{n,m}

n~m次

元字符意义
.换行符以外任意字符
\w字母数字下划线
\s空白字符(空格 换行符 制表符)
\d数字
\W非字母数字下划线
\S非空白字符
\D非数字
\n换行符
\t制表符
^字符串开始
$字符串结尾
a|b字符a或字符b
()匹配括号内的表达式
[abc]匹配字符a或b或c
[^abc]匹配除了a、b、c的字符
规则意义
re.I忽略大小写
re.L不建议使用,改用re.U
re.M多行匹配
re.S令 . 可以匹配换行符
re.U使用unicode字符集
re.X忽略匹配表达式中的空白符和#,除非加\,令你可以在正则表达式中加注释

        一个小细节,.*会贪婪匹配,越多越好,.*?会非贪婪匹配越少越好

        好,基础知识都在上面,现在我们来尝试匹配网页吧。 通过在网页中查看,我们发现需要获取的url前后有<li><a href="和.+产出表</a><span>,所以我们可以根据这一点来写正则表达式,最终形成如下代码:

import re
path = "国家数据.html"
with open(path,mode="r", encoding="utf-8") as f: # 下载源码
    data = f.read()
regular = re.compile(r'<li><a href="(?P<url>.*)">(?P<year>.*)投入产出表</a><span>')
result_1 = regular.findall(data)
result_2 = regular.finditer(data)
result_3 = regular.search(data)
result_4 = regular.match(data)
print(result_1)
for i in result_2:
    print(i.group())
    print(i.group("url"))
    print(i.group("year"))
print(result_3.group())
print(result_4)

         这里面()划定了一个组,而?P<name>给组起了一个名字,结果如下:

         finditer返回的迭代器是我最常用,也是我觉着最好用的。

三、bs4

        bs4全称beautifulsoup4。它主要是创建解析树,用来导航、搜索、修改HTML和XML文档,效率可能比其他的略低,但比较健壮,不易出错。

from bs4 import BeautifulSoup  # bs

        基础用法就是先使用  bs = BeautifulSoup(data, "html.parser")  将html代码交给bs4处理为树形结构,然后在得到的bs对象中查找需要的数据。

        处理后数据是一个BeautifulSoup,即文档,文档中有许多tag(标签),标签也能够包含标签,就像上图的<div>、<a>、<li>一样。我们可以通过bs.ul来访问第一个ul标签。有的标签具有属性,像是最外层的div标签就有id属性、第一个a有href属性一样。可以像是访问字典一样,通过bs.ul.li.a["href"]或者bs.ul.li.a.get("href")来访问属性的值。如果属性有多个值或者属性名字为class,会返回列表。

除了tag以外,还有NavigableString(标签的值)以及Comment(注释和特殊字符串),标签的值一般是字符串,字符串中无法包含其他标签,同时无法编辑,只能替换。可以通过.string.text获取标签的字符串。若标签内非字符串,第一种返回None,第二种会将内容转化为纯文本输出

我们要筛查的话,可以使用find()或者find_all()方法来的到一个对象或者所以符合要求的对象,

find_all比find只多了一个limit参数,其他的参数相同

 好,总结一下。

(一)、访问属性

标签["属性名"]

标签("属性名")

class返回列表,其他的返回字符串

(二)、获取标签的值

.string                        空返回None

.text                            返回内容纯文本

 (三)、查询方法

find(name , attrs , recursive , string)       

find_all(name , attrs , recursive , string, limit)

标签名,属性名和属性值(class_特殊),搜索全部子孙节点,字符串内容,最大返回数

        除此之外,还有css选择器,但我没看,觉得不够用的可以再去学习一下。

        利用上述知识,我们可以使用下面代码获得所需数据了:

from bs4 import BeautifulSoup  # bs

path = "国家数据.html"
with open(path, mode="r", encoding="utf-8") as f:  # 下载源码
    data = f.read()
bs = BeautifulSoup(data, "html.parser")  # html代码交给bs处理'
ul = bs.find("ul", class_="active clearfix")  # 查找标签名为ul,属性class值为”active clearfix“的tag
data = ul.find_all("a")  # 查找所有a标签
for i in data:
    print(i["href"], i.string)

 很简短,不是吗。

 四、xpath

        这东西比bs快点,而且有开发工具加持,能够精准定位。它和bs4挺像的,是一种专门用于XML文档定位和选择节点的语言。但用起来也挺难,这里说点简单的先用上。

from lxml import etree        # 导入

        xpath的节点就像是上面的tag,树形结构,跟文件夹似的,使用etree.HTML(data)来处理数据。

        首先是xpath支持路径表达式,和我们常见的文件路径相似:

/根节点开始
//不考虑位置
.当前节点
..父节点
@选取属性
*通配符,任何
|
nodename所有子节点
text()获取文本

        我们可以通过.xpath来执行路径表达式。比如还是上文中的登录部分,我们想获取登录的文本,可以使用tree.xpath("/html/body/div[2]/div/div/ul/li[1]/a/text()")来得到结果,什么?很长,长就对了,这就就不是给人数的。(注意,它的下标从1开始)

        这就要说到上面的开发工具加持了,打开开发工具的元素页面,右键需要的元素,就能够直接复制元素的Xpath地址了。

        我们再来看看这条代码:tree.xpath("//*[@id='top']/div/div/ul/li[1]/a/text()")照样能找到位置,它用了谓语表达式,[@id='top']代表标签有个叫id的属性,值为'top',还能写出一些其他的谓语表达式,比如[last()]表示最后一个节点,[text()="登录"]选择文本为登录的节点,[id>1]选择id值大于1的节点等。

        xpath还有一些接口:

xpath()路径表达式获取节点列表
find()查第一个匹配的节点
findall()查所有匹配节点
text获取文本内容
attrib获取节点属性

        好的,现在我们开始获取所需数据吧,要获得想要元素的位置,一点点找太麻烦了,我们可以使用左上角的检查工具,然后鼠标移动到所需的数据上,就能知道这个数据是从哪段代码中显示的了。

from lxml import etree

path = "国家数据.html"
with open(path, mode="r", encoding="utf-8") as f:  # 下载源码
    data = f.read()
tree = etree.HTML(data)
ul1 = tree.xpath("/html/body/div[6]/div[3]/div[2]/div[2]/ul[1]")[0]
ul2 = tree.xpath('//ul[@class="active clearfix"]')[0]
print(ul1 == ul2)
out_data = ul1.xpath('./li/a')
print(out_data == ul1.findall("li/a"))
print(out_data == tree.xpath('//ul[@class="active clearfix"]//a'))
for i in out_data:
    print(i.attrib["href"],i.text)

方法很多,选种喜欢的用就行。 

注意上面获得的url前面拼接上原网址才是完整url。

后续:登录和代理

改天写如何处理登录以及代理,详情见三、登录以及代理。

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

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

相关文章

三周精通FastAPI:10 Cookie 参数 和Cookie 参数模型

官方文档&#xff1a;Cookie 参数 - FastAPI Cookie 参数 定义 Cookie 参数与定义 Query 和 Path 参数一样。 源码&#xff1a; from typing import Annotatedfrom fastapi import Cookie, FastAPIapp FastAPI()app.get("/items/") async def read_items(ads_id…

PHP泵的比例流量控制阀放大器

01 PHP 05 PCS005、01 PHP 1 PCS005、01 PHP 2 PCS005、01 PHP 3 PCS005&#xff0c;01 FCV 2 M、01 FCV 3 M、01 PHP 05 PCLS005、01 PHP 1 PCLS005、01 PHP 2 PCLS005、01 PHP 3 PCLS005&#xff0c;FCV比例流量控制阀旨在与Berarma的PHP2和PHP3泵最佳集成&#xff0c;但由于…

戴尔电脑win11找不到D盘的解决办法

新公司给配的戴尔电脑&#xff0c;系统是win11&#xff0c;第一天用的好好地&#xff0c;第二天不知道什么原因&#xff0c;D盘找不到了&#xff0c;在网上搜了好多教程也没用&#xff0c;最后咨询客服&#xff0c;找到了解决办法 若【磁盘管理】界面看不到硬盘分区或无法进入…

比亚迪车机安装第三方应用教程

比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP&#xff0c; 无论是dlink3.0还是4.0都是安卓系统&#xff0c;因此理论上安卓应用是都可以安装的&#xff0c;主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种&#xff0c;直接从电脑端下载安装布…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装&#xff08;适用于Windows等操作系统&#xff09;3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头&#xff0c;检测人脸 一、dlib库的安装 在PyCharm中&…

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的&#xff0c;在日志中是找不到痕迹的&#xff0c;但是这个主…

mongodb在linux下的部署

目录 版本部署上传到服务器中创建目录&#xff0c;解压创建mongodb.conf添加环境变量添加到系统服务中centos6 中添加到服务中 重新加载服务并启动卸载&#xff0c;mongodb.conf配置项等 创建用户&#xff0c;设置用户名密码角色启动验证验证 常见知识mongodb角色mongodb.conf配…

如何禁止上班期间浏览无关网站?

禁止员工在上班期间浏览无关网页主要是为了提升工作效率和生产力&#xff0c;确保员工能够专注于工作任务。同时&#xff0c;这种做法有助于降低网络安全风险&#xff0c;防止恶意软件和钓鱼攻击&#xff0c;减少数据泄露和法律风险&#xff0c;维护公司的专业形象&#xff0c;…

数据结构深度优先搜索遍历连通图+非连通图(C语言代码+遍历+终端输入内容)

首先数据结构(C语言版第二版)的关于深度优先搜索遍历连通图的图G4如下: 使用邻接表去创建上面这个无向图&#xff0c;然后再使用书本DFS函数以及DFSTraverse函数实现深度优先搜索遍历 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #…

微调大模型-2-Qwen基座模型使用

下载Qwen源码 Qwen作为中文支持非常nice的模型&#xff0c;很适合用于LLM学习。在云服务器里clone Qwen工程。 git clone https://github.com/QwenLM/Qwen2.5.git原始模型使用主要基于cli_demo.py-命令行调用&#xff0c;web_demo.py-网页调用。 预览这两个文件时&#xff0c…

Python | Leetcode Python题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, rects: List[List[int]]):self.rects rectsself.sum [0]for a, b, x, y in rects:self.sum.append(self.sum[-1] (x - a 1) * (y - b 1))def pick(self) -> List[int]:k randrange(self.sum[-1…

vue3移动端可同时上传照片和视频的组件

uni-app中的uni-file-picker可单独上传照片或视频&#xff0c;但不支持同时上传照片和视频。本篇博客使用image标签和video标签实现移动端&#xff08;H5app小程序&#xff09;中照片和视频的同时上传。 本篇博客采用的是照片和视频的单独上传&#xff0c;但可同时展示&#xf…

Qt(简介)

1. Qt简介 Qt是一个基于C的图形用户界面&#xff08;GUI&#xff09;框架&#xff0c;可以开发可视化人机交互程序&#xff0c;但是这并不是Qt的全部。Qt除了可以绘制漂亮的界面外&#xff0c;还包含很多其他的功能&#xff1a;多线程、数据库、图像处理、音视频处理、网络通信…

后台管理员登录实现--系统篇

我的小系统后台原来就有一个上传图片的功能还夹带个删除图片的功能&#xff0c;还嵌到了一个菜单里面。之前效果如下 那么现在为了加大安全力度&#xff0c;想增加一个登录页面。通过登录再到这个页面。看着貌似很简单&#xff0c;但是听我细细说来&#xff0c;要新增些什么东西…

MySQL-视图 (ಥ_ಥ)

文本目录&#xff1a; ❄️一、什么是视图&#xff1a; ❄️二、创建视图&#xff1a; ❄️三、使用视图&#xff1a; ❄️四、修改数据&#xff1a; 1、注意事项&#xff1a; ❄️五、删除视图&#xff1a; ❄️六、视图的优点&#xff1a; ❄️总结&#xff1a; 对于这…

HT7179 26.8V,15A高效升压转换器

1、特征 输入电压范围:2.7V-25V 输出电压范围:最高26.8V 固定开关频率:350kHz 可编程峰值电流:最高15A 高转换效率1 95% (PVIN 12V, VOUT25V, IOUT 2A) 94%(PVIN 12V, VOUT25V, IOUT 4.5A) 93%(PVIN 7.2V, VOUT12V, IOUT 1.5A) 90% (PVIN 7.2V, VOUT12V, IOUT 5A) 96%(PVIN…

Perl打印9x9乘法口诀

本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式&#xff0c;帮助捕捉变量声明等错误 use warnings; # 启用警告&#xff0c;帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i&#xff0c;遍历 1…

MoCoOp: Mixture of Prompt Learning for Vision Language Models

文章汇总 当前的问题 1)数据集风格变化。 如图1所示&#xff0c;对于一个数据集&#xff0c;单个软提示可能不足以捕获数据中呈现的各种样式。同一数据集中的不同实例可能与不同的提示符兼容。因此&#xff0c;更**自然的做法是使用多个提示来充分表示这些变化**。 2)过拟合…

V4L2驱动框架

文章目录 一、V4L2简介二、v4l2驱动关键组件&#xff08;一&#xff09;video_device结构体v4l2操作方法结构体v4l2的ioctl操作方法结构体 &#xff08;二&#xff09;v4l2_device结构体 一、V4L2简介 V4L2&#xff0c;即Video for Linux two&#xff0c;是Linux内核中用于视频…

qt项目使用其他项目的ui之单继承之成员变量

第一步添加.ui文件 第二步&#xff0c;点击编译(原理&#xff1a;qt的uic会将.ui界面编译成c文件) 第三步&#xff1a;在编译后的目录下找到#include “ui_pagewidget.h” 第四步&#xff1a; #ifndef USA_H #define USA_H#include <QWidget>#include "ui_pagew…