爬虫(二)解析数据

news2024/11/14 6:36:57

文章目录

  • 1. Xpath
  • 2. jsonpath
  • 3. BeautifulSoup
  • 4. 正则表达式
    • 4.1 特殊符号
    • 4.2 特殊字符
    • 4.3 限定符
    • 4.3 常用函数
    • 4.4 匹配策略
    • 4.5 常用正则

爬虫将数据爬取到后,并不是全部的数据都能用,我们只需要截取里面的一些数据来用,这也就是解析爬取到的信息,在解析方面,我们常用的手段有三个,Xpath,jsonpath以及BeautifulSoup,接下来我将对其分别进行介绍。

1. Xpath

Chrome有Xpath的插件,可以在应用商店里面下载一个,而Python中使用Xpath解析的话需要安装 lxml 库。

lxml 库的方法很多,这么只讲一些涉及到爬虫解析的方法,即主要使用的是 lxml 中的 etree 。Xpath的主要使用语句如下:

语句含义
//查找所有子孙结点,忽略层级
/只查找子结点
@选取属性
..选取当前节点的父节点
*通配符
[]选取子元素,如 [1] 表示选取第一个元素
div[@id]查找有 id 属性的 div 标签
div[@id="name"]查找 id="name" 属性的 div 标签
div[contains(@id, "name")]查找 id 中包含 namediv 标签
div[starts-with(@id, "name")]查找 id 中以 name 开头的 div 标签
div[@id="name" and @class="name1"]逻辑与查询
div[@id="name"] | div[@class="name1"]逻辑或操作,逻辑或不能写成 div[@id="name" | @class="name1"]

我们查询的HTML 代码如下所示:

<!DOCTYPE html>
<html lang="en" >

<head>
 <meta charset="UTF-8"/>

 <title></title>

</head>
<body>
    <div class="wrapper">
        <a href="www.biancheng.net/product/" id="site">website product</a>
        <ul id="sitename">
        <li><a href="http://www.biancheng.net/" title="编程帮" id="1">编程</a></li>
        <li><a href="http://world.sina.com/" title="编程帮" id="2">微博</a></li>
        <li><a href="http://www.baidu.com" title="百度">百度贴吧</a></li>
        <li><a href="http://www.taobao.com" title="淘宝">天猫淘宝</a></li>
        <li><a href="http://www.jd.com/" title="京东">京东购物</a></li>
        <li><a href="http://c.bianchneg.net/" title="C语言中文网">编程</a></li>
        <li><a href="http://www.360.com" title="360科技">安全卫士</a></li>
        <li><a href="http://www.bytesjump.com/" title="字节">视频娱乐</a></li>
        <li><a href="http://bzhan.com/" title="b站">年轻娱乐</a></li>
        <li><a href="http://hao123.com/" title="浏览器Chrome">搜索引擎</a></li>
        </ul>
    </div>
</body>
</html>

下面是我们的代码查询示例:

from lxml import etree

tree = etree.parse('test.html')

# 找到ul下所有的a标签的文本内容
find1 = tree.xpath('//ul//a/text()')
print('find1 = {}'.format(find1))

# 找到ul下所有的a标签中title="编程帮"的标签内容
find2 = tree.xpath('//a[@title="编程帮"]/text()')
print('find2 = {}'.format(find2))

# 找到ul下所有的a标签中title="编程帮"且id="1"的标签内容
find3 = tree.xpath('//a[@id="1" and @title="编程帮"]/text()')
print('find3 = {}'.format(find3))

# 找到ul下所有的a标签中title="淘宝"或id="1"的标签内容
find4 = tree.xpath('//a[@id="1"]/text() | //a[@title="淘宝"]/text()')
print('find4 = {}'.format(find4))

# 找到ul下所有的a标签中title包含"C"的标签内容
find5 = tree.xpath('//a[contains(@title, "C")]/text()')
print('find5 = {}'.format(find5))

# 找到ul下所有的a标签的以"C"开头的title的标签内容
find6 = tree.xpath('//a[starts-with(@title, "C")]/text()')
print('find6 = {}'.format(find6))

# 找到ul下所有的a标签中title="淘宝"或id="1"的标签的爷爷结点的id
find7 = tree.xpath('//a[starts-with(@title, "C")]/../../@id')
print('find7 = {}'.format(find7))

输出如下:

find1 = [‘编程’, ‘微博’, ‘百度贴吧’, ‘天猫淘宝’, ‘京东购物’, ‘编程’, ‘安全卫士’, ‘视频娱乐’, ‘年轻娱乐’, ‘搜索引擎’]
find2 = [‘编程’, ‘微博’]
find3 = [‘编程’]
find4 = [‘编程’, ‘天猫淘宝’]
find5 = [‘编程’, ‘搜索引擎’]
find6 = [‘编程’]
find7 = [‘sitename’]

接下来我们讲讲最开始安装的Xpath的插件有什么作用。在这里我们以百度首页为例,按下 Ctrl+Shift+x ,并按下F12唤出开发者工具,页面如下。
在这里插入图片描述

上面的黑框就是插件所起的效果,比如说我们获取上图的 点击一下,了解更多 字样,那我们就可以在黑框中输入我们的Xpath查询语句,黑框右边就会出现语句查询得到的结果,非常实用。
在这里插入图片描述
当然,如果你不想这样看得眼花缭乱的去写Xpath也行,只需要在F12开发者模式下右击你想要查询的元素,选择复制Xpath即可,如下图所示,实际上,我们一般选择的是这种方法,虽然有的时候复制的并不是最简的Xpath语法,但是这确实有效。
在这里插入图片描述

2. jsonpath

jsonpath使用前必须安装jsonpath的包,jsonpath 是参照xpath表达式来解析xml文档的方式,jsonpath的入门可以参考这篇文章,在这里,我将主要的点进行一下说明。

学会了Xpath的语法,那么jsonpath的语法其实可以对照着进行学习。

Xpathjsonpath说明
/$表示根元素
.@当前元素
/. or []子元素
父元素
//递归下降,JSONPath是从E4X借鉴的。
**通配符,表示所有的元素
@属性访问字符
[][]子元素操作符
|[,]逻辑或。jsonpath允许name或者 [start:end:step] 的数组分片索引
[]?()应用过滤表示式

为了更加直观一点,我把文章的例子搞过来,大家可以对照着看。

测试数据如下:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
XPathJSONPath结果
/store/book/author$.store.book[*].author书点所有书的作者
//author$..author所有的作者
/store/*$.store.*store的所有元素。所有的bookst和bicycle
/store//price$.store..pricestore里面所有东西的price
//book[3]$..book[2]第三个书
//book[last()]$..book[(@.length-1)]最后一本书
//book[position() < 3]$..book[0,1]
$..book[:2]
前面的两本书。
//book[isbn]$..book[?(@.isbn)]过滤出所有的包含isbn的书。
//book[price<10]$..book[?(@.price<10)]过滤出价格低于10的书。
//*$..*所有元素。

3. BeautifulSoup

BeautifulSoup 库也是解析爬虫的一大利器,BeautifulSoup 库的解析速度比 Xpath 相对来说更慢一些,但是使用方法简单了不少。这里将BeautifulSoup 常用的方法例举如下:

方法含义
soup.a找到第一个 a 标签
soup.a.name找到第一个 a 标签,并输出标签名
soup.a.attrs找到第一个 a 标签,并将标签属性以字典列出
soup.a.get_text()找到第一个 a 标签,并输出其内容
soup.find('a', class_='name1')找到第一个 class='name1'a 标签
soup.find_all('a')找到全部的 a 标签,并以列表形式返回
soup.find_all(['a', 'span'])找到全部的 a 标签和 span 标签
soup.find_all('a', limit=2)找到前两个 a 标签
soup.select('a')找到全部的 a 标签,并以列表返回
soup.select('.a1')找到全部的 class='a1' 的标签
soup.select('#a1')找到全部的 id=a1 的标签
soup.select('a[class]')找到全部的拥有 class 属性的 a 标签
soup.select('a[class='name1']')找到全部的 class='name1'a 标签
soup.select('a', 'span')找到全部的 a 标签和 span 标签
soup.select('div li')找到 div 后代中的所有 li 标签
soup.select('div > li')找到 div 子代(即下面第一层级)中的所有 li 标签

我们仍以第一节中 Xpath 的HTML代码为例进行查询。

from bs4 import BeautifulSoup

# 使用lxml解析器
soup = BeautifulSoup(open("test.html", encoding='utf-8'), "lxml")

find1 = soup.a
print('find1 = {}'.format(find1.get_text()))
print('find1.name = {}'.format(find1.name))
print('find1.attrs = {}'.format(find1.attrs))

# 找到id=site 的标签
find2 = soup.select('#site')
print('find2 = {}'.format(find2))

# 找到前两个 a 标签和 li 标签
find3 = soup.find_all(['a', 'li'], limit=2)
print('find3 = {}'.format(find3))

# 找到class=th 的 a 标签
find4 = soup.select('a[class="th"]')
print('find4 = {}'.format(find4))

4. 正则表达式

最后我们来讲一讲正则表达式。爬虫解析数据中最出名的当属正则表达式了,但是正则表达式并不是仅仅在爬虫中才有使用,很多的搜索功能或者筛选功能都支持正则表达式。聊到Python正则表达式的支持,首先肯定会想到re库,这是一个Python处理文本的标准库,下面我就来详细讲讲re库的使用。

4.1 特殊符号

正则表达式中存在这一些特殊符号,这些符号的使用能够带来不同的匹配作用,介绍如下:

模式描述
.匹配除换行符 \n 之外的任何 单字符。要匹配 . ,请使用 \. 。
*匹配前面的 子表达式 零次或多次。要匹配 * 字符,请使用 \*。
+匹配前面的 子表达式 一次或多次。要匹配 + 字符,请使用 \+。
?匹配前面的 子表达式 零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
^匹配输入字符串的开始位置,在方括号表达式中使用时,表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
$匹配字符串的结尾位置。如果设置了Multiline 属性,则 $ 也匹配 \n 或 \r。要匹配 $ 字符本身,请使用 \$。
\转义字符。将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
|关系符号“或”。指明两项之间的一个选择。要匹配 |,请使用 \|。

4.2 特殊字符

正则表达式中还存在一些以转义字符开头的特殊字符,这些符号也能表示一些匹配的规则。

模式描述
\d匹配数字:[0-9]
\D匹配非数字
\s匹配任何空白字符
\S匹配非空白字符
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\A仅匹配字符串开头,同^
\Z仅匹配字符串结尾,同$
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’

4.3 限定符

限定符用来指定正则表达式的一个给定 子字符串 必须要出现多少次才能满足匹配。

字符描述
( )标记一个 子表达式 的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
[ ]标记一个 中括号表达式 的开始和结束位置。表示字符集合。要匹配这些字符,请使用 \[ 和 \]。
{ }标记 限定符表达式 的开始和结束位置。要匹配这些字符,请使用 \{ 和 \}。
{n}n 是一个非负整数。它前面的 字符 或 子字符串 匹配确定的 n 次。
{n,}n 是一个非负整数。它前面的 字符 或 子字符串 至少匹配n 次。
{,m}m 为非负整数,它前面的 字符 或 子字符串 最多匹配 m 次。
{n,m}n 和 m 均为非负整数,其中n <= m。它前面的 字符 或 子字符串 最少匹配 n 次且最多匹配 m 次。

4.3 常用函数

接下来介绍 re 库中的常用函数。

  1. match
    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None,只匹配一个。
    函数的使用如下:

    re.match(pattern, string, flags=0)
    

    其中 pattern 是要匹配的正则表达式,string 是要匹配的字符串,flags 是正则表达式匹配的模式。

  2. search
    re.search 扫描整个字符串并返回第一个成功的匹配。
    函数的使用如下:

    re.search(pattern, string, flags=0)
    

    其中 pattern 是要匹配的正则表达式,string 是要匹配的字符串,flags 是正则表达式匹配的模式。示例如下:

    import re
    
    s = 'Red里面香克斯帅爆了好吧'
    pattern = r'香克斯.'
    print('re.search结果:{}'.format(re.search(pattern, s).group()))
    print('re.match结果:{}'.format(re.match(pattern, s)))
    

    输出结果为

    re.search结果:香克斯帅
    re.match结果:None

  3. sub
    re.subre 模块的替换函数。
    函数的使用如下:

    re.sub(pattern, repl, string, count=0, flags=0)
    

    其中 pattern 是要匹配的正则表达式,repl 是要替换成什么字符串,string 原始字符串,count 表示模式匹配后替换的最大次数,默认 0 表示替换所有的匹配,flags 是正则表达式匹配的模式。

  4. compile
    re.compile 函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match()search() 这两个函数使用。
    函数的使用如下:

    re.compile(pattern[, flags])
    

    其中 pattern 是要匹配的正则表达式,flags 可选,是正则表达式匹配的模式。示例如下。

    import re
    
    s = 'Red里面香克斯帅爆了好吧'
    pattern = re.compile(r'香克斯.')
    m = pattern.search(s)
    print('匹配结果:{}'.format(m.group()))
    print('替换结果:{}'.format(re.sub('香克斯', '路飞', s)))
    

    输出结果如下:

    匹配结果:香克斯帅
    替换结果:Red里面路飞帅爆了好吧

  5. findall
    re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
    函数的使用如下:

    findall(string[, pos[, endpos]])
    

    其中 string 是字符串,pos 是可选参数,表示匹配开始的位置,endpos 是可选参数,表示匹配结束的位置。

  6. split
    re.split split 方法按照能够匹配的子串将字符串分割后返回列表
    函数的使用如下:

    re.split(pattern, string[, maxsplit=0, flags=0])
    

    其中 pattern 是匹配的正则表达式,string 是要匹配的字符串,maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数,flags 是匹配模式。示例如下:

    import re
    
    s = 'Red里面香克斯帅爆了好吧,香克斯牛皮'
    pattern = re.compile(r'香克斯.')
    m = pattern.findall(s)
    print('匹配结果:{}'.format(m))
    print('切分结果:{}'.format(re.split('香克斯.', s)))
    

最后,对于 search() 以及 match() 函数匹配后返回的 Match 对象,都有以下的方法可以使用:

方法描述
group([group1, …])获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()group(0)
start([group])获取分组匹配的子串在整个字符串中的起始位置
end([group])获取分组匹配的子串在整个字符串中的结束位置
span([group])方法返回 (start(group), end(group))

4.4 匹配策略

正则表达式中常用的匹配策略有四种,可以在各函数的flag中进行模式指定。

  1. IGNORECASE
    可以使用 re.IGNORECASEre.I 标志。进行忽略大小写的匹配。示例如下:

    import re
    
    s = 'Red里面香克斯帅爆了好吧,香克斯牛皮'
    pattern1 = re.compile(r'r')
    pattern2 = re.compile(r'r', re.I)
    print('默认情况:{}'.format(pattern1.findall(s)))
    print('改变后为:{}'.format(pattern2.findall(s)))
    

    输出结果为

    默认情况:[]
    改变后为:[‘R’]

  2. ASCII
    可以使用 re.ASCIIre.A 标志。让 \w, \W, \b, \B, \d, \D, \s\S 只匹配ASCII,而不是Unicode。示例如下:

    import re
    
    s = 'Red里面香克斯帅爆了好吧\n香克斯牛皮'
    pattern1 = re.compile(r'\w+')
    pattern2 = re.compile(r'\w+', re.A)
    print('默认情况:{}'.format(pattern1.findall(s)))
    print('改变后为:{}'.format(pattern2.findall(s)))
    

    输出结果为

    默认情况:[‘Red里面香克斯帅爆了好吧’, ‘香克斯牛皮’]
    改变后为:[‘Red’]

  3. DOTALL
    可以使用 re.DOTALLre.S 标志。DOT表示 .,ALL表示所有,连起来就是 . 匹配所有,包括换行符\n。默认模式下.是不能匹配行符\n的。示例如下:

    import re
    
    s = 'Red里面香克斯帅爆了好吧\n香克斯牛皮'
    pattern1 = re.compile(r'香克斯.*')
    pattern2 = re.compile(r'香克斯.*', re.S)
    print('默认情况:{}'.format(pattern1.findall(s)))
    print('改变后为:{}'.format(pattern2.findall(s)))
    

    输出结果为

    默认情况:[‘香克斯帅爆了好吧’, ‘香克斯牛皮’]
    改变后为:[‘香克斯帅爆了好吧\n香克斯牛皮’]

  4. MULTILINE
    可以使用 re.MULTILINEre.M 标志。多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,影响 ^ 和 $。示例如下:

    import re
    
    s = '香克斯Red里面帅爆了好吧\n香克斯牛皮'
    pattern1 = re.compile(r'^香克斯')
    pattern2 = re.compile(r'^香克斯', re.M)
    print('默认情况:{}'.format(pattern1.findall(s)))
    print('改变后为:{}'.format(pattern2.findall(s)))
    

    输出结果为

    默认情况:[‘香克斯’]
    改变后为:[‘香克斯’, ‘香克斯’]

  5. VERBOSE
    可以使用 re.VERBOSEre.X 标志。详细模式,可以在正则表达式中加注解,会忽略正则表达式中的空格和 # 后面的注释。示例如下:

    import re
    
    s = '香克斯Red里面帅爆了好吧香克斯牛皮'
    pattern1 = re.compile(r'^香克斯       #四皇之一')
    pattern2 = re.compile(r'^香克斯       #四皇之一', re.X)
    print('默认情况:{}'.format(pattern1.findall(s)))
    print('改变后为:{}'.format(pattern2.findall(s)))
    

    输出结果为

    默认情况:[]
    改变后为:[‘香克斯’]

4.5 常用正则

正则表达式解释
[\u4e00-\u9fa5]+匹配汉字

这里我给一个就行,其他的有什么功能都可以去查。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过测试驱动开发(TDD)的方式开发Web项目

最近在看一本书《Test-Driven Development with Python》&#xff0c;里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目。刚好这本书中使用了我之前所了解的一些技术&#xff0c;Django、selenium、unittest等。所以&#xff0c;读下来受益匪浅。 我相…

NFT的前景,元宇宙的发展

互联网的普及和数字技术的广泛应用&#xff0c;成为消费升级的新动力&#xff0c;在不断创造出更好的数字化生活的同时&#xff0c;也改变了人们的消费习惯、消费内容、消费模式&#xff0c;甚至是消费理念&#xff0c;数字经济时代的文化消费呈现出新的特征。 2020年有关机构工…

性能优化的核心思路

性能优化的本质是良好的用户体验和有限的资源之间的矛盾。核心思路【1】堆硬件 优化软件&#xff08;算法、步骤&#xff09;【2】开源&#xff08;堆机器&#xff09; 节流&#xff08;提高资源利用率&#xff0c;少占资源&#xff09;【3】输入、计算、输出【4】权衡核心思想…

谷粒学院开发(二):教师管理模块

前后端分离开发 前端 html, css, js, jq 主要作用&#xff1a;数据显示 ajax后端 controller service mapper 主要作用&#xff1a;返回数据或操作数据 接口 讲师管理模块&#xff08;后端&#xff09; 准备工作 创建数据库&#xff0c;创建讲师数据库表 CREATE TABLE edu…

git 当有人邀请你加入项目(gitee)

第一步&#xff0c;找到仓库地址 https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git 2&#xff0c;打开git bush git clone https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git 这条命令新建一个名为abcd&#xff08;也就是项目目录结尾…

python操作频谱仪(是德科技N9030B)

由于工作需要&#xff0c;需要针对产品进行一些自动化的测试&#xff0c;其中就包含了验证开机启动或者长时间运行时候对射频、晶振频率等等一些列进行获取频率或者功率的偏差。这里就需要用到了频谱仪&#xff0c;可以使用脚本连接到频谱仪进行循环对数据的采集等等。直接开始…

Python中的property介绍

Python中的property介绍 Python中进行OOP&#xff08;面向对象程序设计&#xff09;时&#xff0c;获取、设置和删除对象属性&#xff08; attribute&#xff09;的时候&#xff0c;常常需要限制对象属性的设置和获取&#xff0c;比如设置为只读、设置取值范围限制等&#xff…

28个案例问题分析---06---没有复用思想的接口和sql--mybatis,spring

复用思维故事背景没有复用的接口没有复用思想的接口优化方案问题一优化获取所有的课程获取某个人创建的课程问题二优化升华故事背景 项目里有两处没有复用的思想的体现。在这里进行总结并且进行优化。以这种思维方式和习惯来指导我们进行开发工作。 没有复用的接口 通过查看代…

PowerShell远程代码执行漏洞(CVE-2022-41076)分析与复现

漏洞概述PowerShell&#xff08;包括Windows PowerShell和PowerShell Core&#xff09;是微软公司开发的任务自动化和配置管理程序&#xff0c;最初只是一个 Windows 组件&#xff0c;由命令行 shell 和相关的脚本语言组成。后于2016年8月18日开源并提供跨平台支持。PowerShell…

网络安全与信息安全的主要区别讲解-行云管家

生活中工作中&#xff0c;我们经常可以听到信息安全与网络安全这两个词语&#xff0c;但很多小伙伴对于两者区分不清楚&#xff0c;今天我们小编就给大家来简单讲解一下这两者的主要区别吧&#xff01; 网络安全与信息安全的主要区别讲解 1、定义不同 网络安全是指网络系统的…

总结:Linux内核相关

一、介绍看eBPF和Cilium相关内容时&#xff0c;碰到Cilium是运行在第 3/4 层&#xff0c;不明白怎么做到的&#xff0c;思考原理的时候就想到了内容&#xff0c;本文记录下内核相关知识。https://www.oschina.net/p/cilium?hmsraladdin1e1二、Linux内核主要由哪几个部分组成Li…

前端——6.文本格式化标签和<div>和<span>标签

这篇文章&#xff0c;我们来讲一下HTML中的文本格式化标签 目录 1.文本格式化标签 1.1介绍 1.2代码演示 1.3小拓展 2.div和span标签 2.1介绍 2.2代码演示 2.3解释 3.小结 1.文本格式化标签 在网页中&#xff0c;有时需要为文字设置粗体、斜体和下划线等效果&#xf…

vuedraggable的使用

Draggable为基于Sortable.js的vue组件&#xff0c;用以实现拖拽功能。 特性 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery为基础 和视图模型同步刷新 和vue2的国度动画兼容 支持撤销操作 当需要完全控制时&#xff0c;可以抛出所有变化 可…

【国际化】vue2+uniapp实现国际化

文章目录前言一、什么是国际化&#xff1f;二、使用步骤1.创建locale文件夹2.创建国际化JSON文件3.引入国际化总结前言 国际化其实是拓展你的应用的受众人群的一种方式&#xff0c;有利于你的项目应用范围更广&#xff0c;uniapp和vue官方文档都有针对于国际化有专门的文档&am…

WIFI电子标签参数

一、4.2寸WIFI电子标签参数 型号 PW42R_V1 尺寸(mm) 104.95*95.93*15.2mm 显示技术 3色墨水屏显示技术 可视区域(mm) 84.6*63.4 分辨率(像素) 400*300 像素尺寸(mm) 0.212*0.212 单点颜色 黑/白/红 视角 180 工作温度 0 - 40℃ 重量 150g 电池 CR2477*6 …

Nginx同一端口部署多个前后端分离的vue项目

要用nginx容器部署多个前端项目可以采用监听端口&#xff0c;和基于location配置两种方法&#xff0c; 我的nginx是使用docker部署的&#xff0c;启动的时候没有开多余的端口&#xff0c;所以采用location配置 一个server下根据根路径不同分别代理访问不同项目。 下面操练起来&…

什么是响应式编程

简称RP&#xff08;Reactive Programming&#xff09; 定义一 响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流&#xff0c;而相关的计算模型会自动将变化的值通过数据流进行传播。 变化传播&#xff1a;主动/自动将…

2023/03/09 - Vue学习笔记 - 【组件通信】 vuex的使用和讲解—$store

官网&#xff1a;https://vuex.vuejs.org/zh/ 1 Vuex存在的意义 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是…

Kafka入门(七)

下面聊聊Kafka的配置参数&#xff0c;包括生产者的配置参数、Broker的配置参数、消费者的配置参数。 1、生产者配置参数 acks 该参数控制了生产者的消息发送确认机制&#xff0c;用于指定分区中必须有多少个副本成功接收到消息后生产者才会认为这条消息写入是成功的&#xff0c…

问题解决:利用GeoFabrik下载OSM数据

问题描述由于OpenStreetMap数据常常是.osmnx格式&#xff0c;需要在Linix系统上进行格式转换&#xff0c;比较不方便。GeoFabrik 下载平台提供了一个很好的直接下载.shp数据格式的途径&#xff0c;链接如下&#xff1a;【无需梯子】Geofabrik Download Server具体下载方法以Nep…