正则、xpath、bs4的区别

【网络爬虫】python中的数据解析工具(re,bs4,xpath,pyquery) 网络数据解析基础工具 阅读详情

一、正则的表达式及其用法

digit 数字   \d\d表示任意的两位数字

word 单词    \w 表示任意的字母和数字

space 空间     \s表示空格

.点   表示任意的内容

a.  表示a后面匹配任意的内容a  aa   af   a3

*   表示内容出现出现0次到多次

a.* 表示  a  a2   ad  asfsdfsd

+: 表示内容出现一次到多次

a.+表示aa ab asfs

^ 表示以———什么开头

$:表示以-------结尾

{n}:表示内容重复n次

\d\d\d     \d{3}

{n,m}:表示最少重复n次,最多重复m次

pattern 模式  compile编译

正则表达式:

content = ‘232432ssdfds’

pattern = re.compile('(a.*b)')

result = pattern.match(content)

print(result)

贪婪与非贪婪模式  

贪婪模式:尽量找到所有服要求的内容

.*称为贪婪模式

.*? 称为非贪婪模式

sub: 替换子串

content = '杨        过对战金轮法王,郭靖观战'

pattern = re.compile(r'杨\s*过')

result= pattern.sub('卢布',content)

print(result)

匹配手机号

pattern = re.compile(r'^((13[0-9])|(14[67])|(15[0-3]|15[5-9])|(16[6])|(18[0|5-9]))\d{8}$')
content = pattern.match('14672432234')

print("能匹配到手机号")

下面实例是百度贴吧信息爬取并存入数据库

import re
from urllib.request import Request, urlopen
import sqlite3

class Datamanger(object):
    def update_new_data(self,oldData):
        name = oldData[0].strip('\n')
        pattern = re.compile(r'<img.*?>')
        name = pattern.sub('', name)
        content = oldData[1].strip('\n')
        pattern = re.compile(r'<br/>')
        content = pattern.sub('', content)
        pattern = re.compile(r'<img.*?>')
        content = pattern.sub('', content)
        content = content.replace(' ', '')
        content = content.replace('<br>', '')
        content = content.replace('<\u3000>', '')
        content = content.replace('</a>', '')
        pattern = re.compile(r'<a.*?>')
        content = pattern.sub('', content)
        # print(name,content)
        newData = (name,content)
        return newData

class BDTBmanager(object):
    connect = None
    cursor = None
    @classmethod
    def create_db_and_table(cls):
        cls.connect = sqlite3.connect("bdtbDB")
        cls.cursor = cls.connect.cursor()
        cls.cursor.execute('create table if not exists bdtbTable(name text, content text)')
        cls.connect.commit()
    @classmethod
    def insert_info_to_table(cls,newData):
        cls.cursor.execute('insert into bdtbTable(name, content) VALUES ("{}","{}")'.format(newData[0],newData[1]))
        cls.connect.commit()
    @classmethod
    def close_db(cls):
        cls.cursor.close()
        cls.connect.close()

class BDTBSpider(object):
    def __init__(self):
        self.first_url = 'https://tieba.baidu.com/p/4685013359?pn='
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0'
        }
        self.dataTool = Datamanger()
    # 获取首页网址,并获取所有初始数据
    def get_code(self,pageindex):
        url = self.first_url + str(pageindex)
        # print(url)
        request = Request(url, headers=self.headers)
        response = urlopen(request)
        # 异常捕获
        code = response.read().decode()
        return code
    # 获取爬虫信息部分
    def get_info(self,code):
        # pattern = re.compile( r'<div class="l_post l_post_bright j_l_post clearfix  ".*?<li class="d_name".*?target="_blank">(.*?)</a>.*?<>.*?<div class="d_post_content_main ">.*?<div class="p_content  ">.*?<div id=".*?class="d_post_content j_d_post_content ">(.*?)</div>',re.S)
        pattern = re.compile(r'<div class="l_post l_post_bright j_l_post clearfix  ".*?target="_blank">(.*?)</a>.*?<div class="d_post_content_main ">.*?<div class="p_content  ">.*?<div class="p_content  ">.*?<div id=".*?class="d_post_content j_d_post_content ">(.*?)</div>',re.S)

        result = pattern.findall(code)
        for oldData in result:
            # print(oldData)
            newData = self.dataTool.update_new_data(oldData)
            BDTBmanager.insert_info_to_table(newData)

BDTBmanager.create_db_and_table()
bdspider = BDTBSpider()
code = bdspider.get_code(1)
bdspider.get_info(code)
for x in range(1, 94):
    code = bdspider.get_info(code)
    bdspider.get_info(code)

BDTBmanager.close_db()

 

二、xpath的用法

xpath在爬虫的应用中很广发,很受欢迎

首先要导入 from lxml import etree

url = 'https://www..........'

response = requests.get(url).text

root = ertee.HTML(response)

li_list = root.xpath('//....................').extract_forst('')

for li in li_list:

    .........................

1.下面是豆瓣top250关于xpath的用法及数据存入excel表格

# -*- coding: utf-8 -*-
from fake_useragent import UserAgent
import xlwt,requests
from lxml import etree
class DBmovie(object):
    def __init__(self):
        self.base_url = 'https://movie.douban.com/top250'
        self.headers = UserAgent()
        self.workBooke = None
        self.sheet = None
        self.record = 1

    def spider_manage(self):
        self.excel_build()
        self.get_url_code()
        self.workBook.save('电影表.xls')

    def excel_build(self):
        self.workBook = xlwt.Workbook(encoding='utf-8')
        self.sheet = self.workBook.add_sheet('电影排行榜')
        self.sheet.write(0,0,'电影排名')
        self.sheet.write(0,1,'电影名称')
        self.sheet.write(0,2,'演员与导演')
        self.sheet.write(0,3,'电影评分')
        self.sheet.write(0,4,'电影影评')
        # self.sheet.write(0,5,'电影内容')


    def get_url_code(self, url =''):
        headers = {
            'User-Agent': self.headers.random
        }
        full_url = self.base_url +url
        # print(full_url)
        response = requests.get(full_url, headers=headers).text
        # print(response)
        code = etree.HTML(response)
        print(code)
        item_div = code.xpath('//div[@class="item"]')
        # print(item_div)
        for tag in item_div:
            movie_name = tag.xpath('.//div[@class="hd"]/a/span/text()')
            # print(movie_name)
            name=''
            for movie in movie_name:
                name += movie
            # print(name)
            movie_rank = tag.xpath('div/em[@class=""]/text()')[0]
            # print(movie_rank)
            movie_author = tag.xpath('.//div[@class="bd"]/p/text()')[0]
            movie_author = movie_author.strip('\n').replace(' ','')
            # print(movie_author)
            movie_grade = tag.xpath('.//span[@class="rating_num"]/text()')[0]
            # print(movie_grade)
            movie_comment = tag.xpath('.//div[@class="star"]/span[last()]/text()')[0]
            movie_comment = movie_comment[0:-3]
            # print(movie_comment)
            # movie_content = tag.xpath('.//p[@class="quote"]/span/text()')[0]
            # movie_content = movie_content.strip('\n').replace('。','')
            # print(movie_content)
            # print(movie_content)
            self.sheet.write(self.record,0,movie_rank)
            self.sheet.write(self.record,1,name)
            self.sheet.write(self.record,2,movie_author)
            self.sheet.write(self.record,3,movie_grade)
            self.sheet.write(self.record,4,movie_comment)
            # self.sheet.write(self.record,5,movie_content)
            self.record += 1
        self.get_next_page(code)

    def get_next_page(self,code):
        next_url = code.xpath('//span[@class="next"]/a/@href')
        # print(next_url)
        if len(next_url) == 0:
            print("已经是最后一页了")
            return
        self.get_url_code(next_url[0])

movie = DBmovie()
movie.spider_manage()

三、bs4美食节实例及数据存入数据库

# -*- coding: utf-8 -*-
from fake_useragent import UserAgent
import requests,sqlite3
from bs4 import BeautifulSoup
class DBmeishijie1(object):
    connect = None
    cursor = None
    def openDB(self):
        self.connect = sqlite3.connect('meishijieaDB')
        self.cursor = self.connect.cursor()
        self.cursor.execute('create table if not exists meishijieTable(name text, src text)')
        self.connect.commit()

    def insert_info(self,name,src):
        self.cursor.execute('insert into meishijieTable (name , src) VALUES ("{}","{}")'.format(name,src))
        self.connect.commit()

    def close(self):
        self.cursor.close()
        self.connect.close()

class MeiShiJieSpider(object):
    def __init__(self):
        self.headers = UserAgent()
        self.DB = DBmeishijie1()

    def spider_manager(self):
        self.DB.openDB()
        code = self.get_first_code('https://www.meishij.net/chufang/diy/')
        self.DB.close()

    def get_first_code(self,url):
        headers = {
            'User-Agent':self.headers.random
        }
        response = requests.get(url,headers=headers).text
        code = BeautifulSoup(response,'lxml')
        # print(code)
        self.get_code_with_info(code)

    def get_code_with_info(self,code):
        div_list = code.select('div.listtyle1')
        # print(div_list)
        for  div in div_list:
            img_alt = div.select('img')[0]['alt']
            # print(img_alt)
            img_src = div.select('img')[0]['src']
            # print(img_src)
            self.DB.insert_info(img_alt,img_src)
        self.next_page_info(code)

    def next_page_info(self,code):
        next_url = code.select('a.next')
        # print(next_url[0])
        if len(next_url) == 0:
            print('最后一页,没数据了')
            return
        self.get_first_code(next_url[0]['href'])

meishi = MeiShiJieSpider()
meishi.spider_manager()

 

关于bs4、xpath和正则表达式在爬虫的应用 关于提取网页中的元素一直都迷糊,不同的方法也容易记混。 1.BeautifulSoup的理解 Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。 它基于HTML DOM 的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,... 阅读详情

相关推荐

python爬虫学习系列之正则、bs4、xpath、jsonpath

python爬虫学习系列之正则、bs4、xpath、jsonpath 正则 bs4 xpath jsonpath

hoochon的博客 912

正则、xpath、bs4三者区别

本篇以 获取美食杰菜谱图片 为例,分别采用正则、xpath、bs4 三种方式,获取同一内容,进行对比,分析三者区别。 url = 'https://www.meishij.net/chufang/diy/guowaicaipu1/japan/' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:...

weixin_42657103的博客 4440

Python 爬虫实战:对比不同解析库的效率(BS4/XPath/ 正则)

摘要:本文对比分析Python爬虫中BS4、XPath和正则表达式三种解析库的性能差异。通过标准化测试发现,正则表达式解析速度最快(0.0083秒),是BS4的9.69倍,内存占用最低(0.92MB);XPath性能居中(0.0210秒),容错性较好;BS4(0.0804秒)虽速度最慢但容错性最佳。测试表明:正则表达式适合高性能简单文本提取,XPath适用于结构化数据解析,BS4则擅长处理不规范HTML。实际开发建议根据数据规模、HTML规范性和性能需求灵活选择,复杂场景可采用混合解析策略。本文提供了可复现

2503_91057718的博客 480

正则和xpath在网页中匹配字段的效率比较

1. 测试页面是https://www.hao123.com/,这个是百度的导航 2. 为了避免网络请求带来的差异,我们把网页下载下来,命名为html,不粘贴其代码。 3.测试办法:   我们在页面中找到 百度新闻 关键字的链接,为了能更好的对比,使程序运行10000次,比较时间差异:         1.正则编码及其时间    start_time...

aini4568的博客 336

movie_content_rating

使用CNN从海报的电影内容分级分类中判断 该项目适用于MScA 32018实时智能系统。 该项目旨在创建一个交互式系统,该系统可读取电影海报并识别其内容等级。 该项目使用Movie-Genre-Classifier(Repo: : )作为参考。 数据源 我们处理过的原始数据集可从Kaggle检索: ://www.kaggle.com/carolzhangdc/imdb-5000-movie-dataset。

RC模型车多电机驱动方案:从电调PWM原理到四电机安全连接实战

在电机控制领域,PWM(脉冲宽度调制)是实现精确调速的核心技术。其原理是通过调节固定周期内高电平的脉宽来编码控制指令,进而驱动电子调速器(电调)改变输出功率。这项技术对于需要多电机协同工作的场景,如RC模型车的差速转向或重型负载驱动,具有关键价值。它能实现动力的精细分配与同步,提升车辆的可控性与通过性。在实际应用中,为确保系统稳定,必须关注电流分配与信号同步问题。例如,通过为每个电机配备独立电调并采用信号并联(Y线)的方式,可以构建可靠的四电机驱动系统。这种方案能有效避免因单个电调过载或电机反电动势不一致导

weixin_30664615的博客 382

python 网页数据对比_xpath与正则表达式抽取网页信息的速度比较

以前我都是用正则表达式处理网页,对于那种非常不是经常改代码的网站,正则提取是非常好的但对于经常改代码的网站,写一个好的正则表达式确实有点费事,用xpath就比较好,但写了脚本之后发现比以前慢一些,于是写了一个小程序测试一下速度随便将一个百度搜索结果页另存为S:\baidu.htm,取title标签中的字符串#coding=utf-8import timeimport reimport timeim...

weixin_39890102的博客 535

Polyworks脚本开发实战指南:高效生成数据彩图与报告的关键指令解析

本文深入解析了Polyworks脚本开发中生成数据彩图与自动化报告的核心指令。通过实战案例,详细介绍了REFERENCE_SURFACE、THICKNESS和CLEARANCE等关键彩图生成指令的正确用法与常见避坑点,并阐述了如何利用REPORT_ITEM命令实现从截图、表格生成到智能排版的全流程自动化,旨在帮助三维检测与质量控制工程师大幅提升工作效率与报告标准化水平。

weixin_29209825的博客 555

关于验证正则和xpath的效率

import time from lxml import etree import re import threading # 多进程模块 class wang(object): def __init__(self): self.t1=time.time() self.html="""<div class="htmledit_views" id="...

weixin_43087796的博客 648

Win10蓝屏代码critical process died的解决方法

critical process died”蓝屏错误是Win10操作系统中较为常见的问题之一。当遇到这一问题时,可以尝试通过修复当前系统、检查硬盘槽位或重新安装系统等方法来解决。本文详细介绍了这三种方法的操作步骤和注意事项,希望能帮助大家摆脱这一困扰。同时,也建议大家在日常使用中注意系统的维护和更新,以减少类似问题的发生。

mmoo_python的博客 9536

目标检测之Mask R-CNN(Pytorch):小白动手实现项目

目标检测之Mask R-CNN:小白动手实现项目Pytorch引言Mask R-CNN原理简述代码、注释及详细解释 引言 首先声明本项目的运行环境。操作系统为Windows,编写环境为Anaconda3 + Jupyter Notebook。Pytorch版本为 torch 1.7.1+cu110 、torchvision版本为 0.8.2+cu110,cuda版本为cu100,显卡为Nvidia 2060。 我是目标检测领域的小白,刚刚完成了Pytorch的相关入门学习任务,所以我认为学习本篇博客的基础

dzc_go的博客 1万+

Python中的正则表达式,xpath与BS4的使用与区别

正则表达式:适合简单的文本匹配和搜索任务,但不适合解析复杂的HTML结构。XPath:适合需要精确定位文档元素的场景,但需要一定的学习成本。:提供了一个简单且强大的接口,适合大多数HTML和XML的解析任务,尤其是当文档结构复杂或不规范时。在选择使用哪种工具时,应根据具体的需求和场景来决定。正则表达式适合文本处理,XPath适合精确的元素定位,而BeautifulSoup适合灵活的文档解析和数据提取。

qq_62926620的博客 846

LSM6DSOW陀螺仪轮询驱动:从I2C/SPI配置到数据读取全解析

惯性测量单元(IMU)是现代嵌入式系统中实现姿态感知与运动跟踪的核心传感器,其通过加速度计和陀螺仪测量线性加速度与角速度。在嵌入式开发中,轮询(Polling)作为一种基础且可靠的通信方式,通过主循环主动查询传感器状态,简化了初始调试与验证流程。对于I2C/SPI接口的数字传感器,掌握寄存器配置、数据就绪标志检查及原始数据转换是通用的驱动方法,能够快速验证传感器工作状态并理解数据流。LSM6DSOW作为一款高性能6轴IMU,支持可配置的量程与输出数据速率,适用于无人机飞控、手持云台等高动态场景。本文以LSM

weixin_28728265的博客 558

爬虫思路对比:xpath和Re正则表达式区别到底在哪?bs4,requests,urllib,xpath,re这些东西区别在哪?(先看路径表达式)

爬虫思路对比:xpath和Re正则表达式区别到底在哪?bs4,requests,urllib,xpath,re这些东西区别在哪?(先看路径表达式)

weixin_69070089的博客 1606

python多线程实现http代理

python多线程实现http代理文章要求1.py socket模块2.py threading模块3.环境搭建3.1设置代理3.2搭建http简单服务器代码分析1.完整代码2.逻辑结构 文章要求 1.py socket模块 socket模块接触后很简单,我实现的是阻塞性的套接字。 需要了解到,连接套接字,监听套接字,和套接字accept()方法的返回值是元组 数据传递过程sock.recv(1024),sock.send()也不需要转换编码,直接以b"二进制流"传输 2.py threading模块 th

qq_43402663的博客 2508

5G初始注册流程详解(2)-Registration Request

1:了解注册的本质,5G终端为什么要注册? 2:SUCI,SUPI,5G-GUTI的区别? 3:为什么会有COMPLETE REGISTRATION REQUEST呢?

weixin_53220301的博客 3794

python2

爬虫: 1.百度百科 2.自己理解: 通过代码、模拟浏览器上网 然后抓取数据的过程 数据解析 2.爬虫是否合法? 1.法律允许 2.有法律风险的 3.统一规定? 【法律界限】 robots.txt协议 4.爬虫的分类: 1.获取一整张页面 【通用爬虫】 2.获取一整张页面 部分数据 【聚焦爬虫】 3.检查页面更新、获取页面最新的更新的数据 【增量式爬虫】 5.爬虫的规则: 1.反爬策略: 门户...

m0_46563929的博客 107

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 525

Python爬虫教程(一):基础知识

目录 01 基础知识 1.1 渲染 1.2http(超文本传输协议)协议 1.3requests进阶 02 数据解析 2.1re模块 2.2 bs4模块 2.3xpath模块 01 基础知识 1.1 渲染 1° 服务器渲染: 直接可以获取源数据,然后用于分析 2° 客户端渲染: 第一次请求只有一个html骨架,查看network预览没有办法获取想要的数据 第二次请求才是拿数据,进行数据展示 1.2http(超文本传输协议)协议 1° 请求 请求行...

csdn1561168266的博客 1646

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

爬虫笔记

1. request 2. xpath 3. 模拟登录 4. 代理 5. 异步 6. selenium

lxin690的博客 413

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python爬虫基础详解

python爬虫基础(牛刀小试)

weixin_63997211的博客 1870

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python爬虫入门总结

网络爬虫,又称网页蜘蛛和网络机器人,是一种按照一定规则,自动地抓取万维网上的信息的程序或脚本。所谓爬取数据,就是通过编写程序,模拟浏览器上网,然后让其去浏览器上抓取数据的过程。爬虫在使用场景中的分类: 通用爬虫:抓取系统重要组成部分。抓取的是一整张页面数据。 聚焦爬虫:建立在通用爬虫基础之上。抓取的是页面中特定的局部内容。 增量式爬虫:检测网站中数据更新的情况。只会抓取网站中...

VinWqx的博客 932

shell 发送post请求参数传不进去_Scrapy-Shell的用法

① Shell方法查找网页数据shell介绍可方便的提供我们做一些测试提取数据 如果想要提取网络数据网页可以在任意地方均可执行如果想要在具体文件或者项目配置信息执行,先进入命令中在执行scrapy shell 命令 scrapy shell urlshell使用爬虫提取数据的时候用xpath或者bs4和re正则表达式提取数据 在scrapy框架中用shell 来方便测试提取数据 可以像爬虫中的pa...

weixin_30510711的博客 446

数据解析学习笔记(正则解析、bs4解析、xpath解析)

聚焦爬虫:爬取页面中指定的页面内容。 - 编码流程: - 指定url - 发起请求 - 获取响应数据 - 数据解析 - 持久化存储 数据解析分类: 正则 bs4 xpath(***) 数据解析原理概述: - 解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储 - 1.进行指定标签的定位 - 2.标签或者标签对应的属性中存储的数据值进行提取(解析) 一、正则解析 常用正则表达式回顾: <div class="thumb"> <a href="/article/12.

zep 543

Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器,让大家更加深刻的理解和熟悉Python选择器。 一、正则表达式 正则表达式为我们提供了抓取数据的快捷方式。虽然该正则表达式更容易适应未来变化,但又存在难以构造、可读性差的问题。当在爬京东网的时候,正则表达式如下...

pdcfighting的博客 1393
上一篇: scrapy框架
下一篇: cookie的初步解析
UserAgent123
博客等级 码龄8年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值