XPath详解教程

目录

        1. XPath 概览

        2. XPath 常用规则

        3. 准备工作

        4.实例引入

        5.所有节点

        6. 子节点

        7.父节点

        8.属性匹配

        9.文本获取

        10.属性获取

        11.属性多值匹配

        12. 多属性匹配

        13.按序选择

        14. 节点轴选择

        结语


1. XPath 概览

        XPath 全称 XML Path Language ,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言 它最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索
        XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式 另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理 几乎所有我们想要定
的节点,者阿以用 XPath 来选择
        XPath于1999年11月16日成为 W3C 标准,它被设计为供 XSLT、XPointer 以及其他 XML 解析 软件使用,更多的文档可以访问其官方网站 xpath cover page - W3C

2. XPath 常用规则

常用的集中规则有:

  • nodename   选择此节点的所有子节点
  • /  从当前节点选择直接子节点
  • // 从当前节点选择子孙节点
  • . 选取当前节点
  •  ..  选取当前节点的父节点
  •  @  选取属性

        举个例子 : //title [@lang = 'ergou']   这个就是选择所有标签名为title 并且 lang的属性值为二狗的元素

        //title [@lang = 'ergou'][1]  这个就是选择所有标签名为title 并且 lang的属性值为二狗的元素的第一个元素

        //title [@lang = 'ergou'][1]/@href   这个就是选择所有标签名为title 并且 lang的属性值为二狗的元素的第一个元素的href 属性

3. 准备工作

        使用之前,首先要确保安装好 lxml 库,若没有安装 ,可以参考安装过程

4.实例引入

        这里首先导人 lxml 库的 etree 模块,然后声明了一段HTML文本,调用 HTML 类进行初始化,这样就成功构造了一个XPath解析对 这里需要注意的是,HTML文本中的最后一个li节点是没有 闭合的,但是etree模块可以自动修正HTML文本
from lxml import etree 
text = ''' 
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
result= etree.tostring(html)
print(result.decode('utf-8'))
        这里我们调用 tostring()方法即可输出修正后的HTML代码,但是结果是 bytes 类型 这里利用
decode()方法将其转成 str 类型,结果如下:

        可以看到,经过处理之后, li 节点标签被补全,并且还向动添加了 body,html 节点

        另外,也可以直接读取文本文件进行解析,示例如下:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= etree.tostring(html)
print(result.decode('utf-8'))

返回:

        至于有 &#13,应该是我手打,不知哪错了,排除这个,结果与上面略有不同,就是多了一个声明DOCTYPE ,不过对解析没有任何影响

5.所有节点

        我们一般会用刀 // 开头的 XPath 规则来选取所有符合要求的节点 这里以上面的 HTML 文本为例, 如果要选取所有节点,可以这样实现:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>'''
result= html.xpath('//*')
print(result)

返回:

        这里使用*代表匹配所有节点,也就是整个 HTML 文本中的所有节点都会被获取 可以看到,返 回形式是一个列表,每个元素是 Element 类型,其后跟了节点的名称,如 html、body、div、ul、li、a等,所有节点都包含在列表中了
        当然 ,此处匹配也可以指定节点名称。如果想获取所有 li 节点,示例如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>'''
result= html.xpath('//li')
print(result)
print(result[0])

返回:

        这里可以看到提取结果是一个列表形式,其中每个元素都是 Element 对象。如果要取出其中一个对象 ,可以直接用中括号加索引,如[0]。

6. 子节点

        我们通过 / 或 // 即可查找元素的子节点或子孙节点。假如现在想选择 li 节点的所有直接a子节点, 可以这样实现:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>'''
result= html.xpath('//li/a')
print(result)

返回:

        此处的 / 用于选取直接子节点 ,如果要获取所有子孙节点,就可以使用 //  例如,要获取 ul 节点下的所有子孙a节点,可以这样实现:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>'''
result= html.xpath('//ul//a')
print(result)

运行结果:

        但是如果这里用 //ul/a ,就无法获取任何结果了 因为 / 用于获取直接子节点,而在 节点下没 有直接 子节点,只有 li 节点,所以无法获取任何匹配结果,代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>'''
result= html.xpath('//ul/a')
print(result)

运行结果为:

7.父节点

        我们知道通过连续的 / 或 // 可以查找子节点或子孙节点,那么假如我们知道了子节点,怎样来查找父节点呢?这可以用 .. 来实现
        比如,现在首先选中 href 属性为 link4.html 节点,然后再获取其父节点,然后再获取其 class
属性,相关代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1. html">first item</a></li>
<li class="item-1"><a href="link2.html"> second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//a[@href="link4.html"]/../@class')
print(result)

返回:

 同时,我们也可以通过 parent:: 来获取父节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result)

8.属性匹配

        在选取的时候,我们还可以用@符号进行属性过滤。比如,这里如果要选取 class为item-1的li
节点,可以这样实现:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//li[@class="item-0"]')
print(result)
        这里我们通过加入[@class= item -0”],限制了节点的 class 属性为 item-0 ,而 HTML 文本中符合 条件的 li 节点有两个,所以结果应该返回两个匹配到的元素 结果如下:

 可见,匹配结果正是两个,至于是不是那正确的两个,后面再验证 。

9.文本获取

        用 XPath 中的 text()  方法获取节点中的文本,接下来尝试获取前面 li 节点中的文本,相关

代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//li[@class="item-0"]/text()')
print(result)

运行结果:

        奇怪的是,我们并没有获取到任何文本,却有WIN回车换行,这是为什么呢?因为 XPath中text()前面是/,而此处/的含义是选取直接子节点,很明显li的直接子节点都是a节点,文本都是在a节点内部的,所以这里匹配到的结果就是被修正的li节点内部的符号,因为自动修正的 li 节点的尾标签有WIN回车换行

        即选中的是这两个节点:
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
        其中一个节点因为向动修正, li 节点的尾标签添加的时候换行了,所以提取文本得到的唯一结果就是 li 节点的尾标签和a节点的尾标签之间的换行符。
        因此,如果想获取 li 节点内部的文本,就有两种方式,一种是先选取a节点再获取文本,另一
种就是使用 //  接下来,我们来看下二者的区别:
        首先 ,选取至a节点再获取文本,代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//li[@class="item-0"]/a/text()')
print(result)

输出为:

        可以看到,这里的返回值是两个,内容都是属性为 item-o的 li 节点的文本,这也印证了前面属性匹配的结果是正确的。
        再来看下用另一种方式(即使用 // )选取的结果,代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//li[@class="item-0"]//text()')
print(result)

输出:

        不出所料,这里的返回结果是3个,可想而知,这里是选取所有子孙节点的文本,其中前两个就 li 的子节点a节点内部的文本,另外一个就是最后一个 li 节点内部的文本,即换行符。

10.属性获取

        我们知道用 text() 可以获取节点内部文本,那么节点属性该怎样获取呢?其实还是用@符号就可。例如,我们想获取所有 li 节点下所有a节点的 href 属性,代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
'''
其中test.html为上述的
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
result= html.xpath('//li/a/@href')
print(result)

返回:

注意:此处和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href="linkl.html ”],而此处的@href 指的是获取节点的某 个属性,二者需要做好区分

11.属性多值匹配

有时候,某些节点的某个属性可能有多个值,例如:
from lxml import etree 
text = '''
<li class="li li-first"><a href ="link.html">first item</a></li> 
'''
html = etree .HTML(text) 
result = html.xpath('//li[contains(@class,"li")]/a/text()')
print(result)
        这样通过 contains() 方法,第一个参数传入属性 名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了,运行结果如下:

 注此种方式在某个节点的某个属性有多个值时经常用到,如某个节点的 class 属性通常有多个。

12. 多属性匹配

        我们可能还遇到一种情况,那就是根据多个属性确定一个节点,这时就需要同时匹配多个属性。此时可以使用运算符 and 来连接,示例如下:
from lxml import etree 
text = '''
<li class="li li-first" name="item"><a href ="link.html">first item</a></li> 
'''
html = etree .HTML(text) 
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
print(result)
        这里的 li 节点又增加了1个属性 name 要确定这个节点 需要同时根据 clas和name 属性来选
择,一个条件是 class 属性里面包含 li 字符串,另一个条件是 name 属性为 item 字符串,二者需要同时满足,需要用 and 操作符相连,相连之后置于中括号内进行条件筛选 运行结果如下:
xpath运算符有哪些呢

13.按序选择

        有时候,我们在选择的时候某些属性可能同时匹配了多个节点,但是只想要其中的某个节点,如第二个节点或者最后一个节点,这时该怎么办呢?
        这时可以利用中括号传入索引的方法获取特定次序的节点,示例如下:
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
#序号是以1开头的,不是以0开头
result= html.xpath('//li[1]/a/text()') #第一个 li 节点
print(result)
result= html.xpath('//li[last()]/a/text()') #最后一个 li 节点
print(result)
result= html.xpath('//li[position()<3]/a/text()') #选取位置小于3的 li 节点,也就是1和2的节点
print(result)
result= html.xpath('//li[last()-2]/a/text()') #选取倒数第三个的节点,last()是最后一个,所有last()-2就是倒数第三个
print(result)

运行结果为:

14. 节点轴选择

        XPath 提供了很多节点轴选择方法,包括获取子元素 、兄弟元素、父元素、祖先元素等,示例如下:
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
#序号是以1开头的,不是以0开头
result= html.xpath('//li[1]/ancestor::*') 
'''第一次选择时,调用了ancestor轴,可以获取所有祖先节点 其后需要跟两个冒号,然后是节点的选择器,这里我们直接使用*,表示匹配所有节点,因此返回结果是第一个 li 节点的所有祖先节点,包括 html、body、div、ul'''
print(result)
result= html.xpath('//li[1]/ancestor::div') 
'''第二次选择时,又加了限定条件,这次在冒号后面加了 div ,这样得到的结果就只有 div这个祖先节点了'''
print(result)
result= html.xpath('//li[1]/attribute::*') 
'''第三次选择时,调用了 attribute 轴,可以获取所有属性值,其后跟的选择器还是*,这代获取节点的所有属性,返回值就是 li 节点的所有属性值'''
print(result)
result= html.xpath('//li[1]/child::a[@href="link1.html"]') 
'''第四次选择时,调用了 child 轴,可以获取所有直接子节点 这里又加了限定条件,选 href 属性为 linkl.html的a节点'''
print(result)
result= html.xpath('//li[1]/descendant::span') 
'''第五次选择时,调用了 descendant 轴,可以获取所有子孙节点 这里又加了限定条件获取 span 节点,所以返回的结果只包含 span 节点而不包含a节点'''
print(result)
result= html.xpath('//li[1]/following::*[2]') 
'''第六次选择时,调用 following 轴,可以获取当前节点之后的所有节点 这里虽然使用的是*匹配,但又加了索引选择,所以只获取了第二个后续节点'''
print(result)
result= html.xpath('//li[1]/following-sibling::*') 
'''第七次选择时,调用 fo llowing -s ibling ,可以获取当前节点之后的所有同级节点,使用*匹配,所以获取了所有后续同级节点'''
print(result)

运行结果:

结语

        到这里,我们基本把会用到的xpath选择器介绍完了。xpath功能非常强大,内置函数非常多,熟练使用后会大大提升HTML信息的提取效率。

如果想查询更多 XPath 的用法,可以查看:XPath 教程
如果想查询更多 .Pyt on xml 库的用法,可以查看:lxml - Processing XML and HTML with Python

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

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

相关文章

【蓝桥杯每日一练】 斐波那契数列

目录 1.说明 2.原理 3.python实现 第一种&#xff1a; 第二种&#xff1a; 第三种 第四种 1.说明 Fibonacci为1200年代的欧洲数学家&#xff0c;在他的着作中曾经提到&#xff1a;「若有一只免子每个月生一只小免子&#xff0c;一个月后小免子也开始生产。起初只有一只免…

C语言二级指针

指针可以指向一份普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一份指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

R 安装详解

目录 1.R软件 的下载 1.1 R下载 1.2 RStudio下载 2.辅助软件 notepad 3.R 扩展软件包的安装与管理 4.基本 R 软件的用法 1.基本运行 2.项目目录 5.RStudio 软件 1.介绍 2.项目 3.帮助 4.使用历史命令 5.放大显示某一窗格 6.运行程序 7.中文编码问题 8.Rmd 文件 …

R 基础入门(1)

目录 一、四则运算 练习&#xff1a; 二、数学函数 1.数学函数——平方根、指数、对数 2.数学函数——取整 3.数学函数——三角函数 4.数学函数——反三角函数 5.分布函数和分位数函数 三、输出 1.简单输出 2.用 sink() 函数作运行记录 练习 四、向量计算与变量赋值…

C语言二维数组指针

二维数组在概念上是二维的&#xff0c;有行和列&#xff0c;但在内存中所有的数组元素都是连续排列的&#xff0c;它们之间没有“缝隙”。 以二维数组 a 为例&#xff1a; int a[3][4] { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };从概念上理解&#xff0c;a 的分布像一…

R 基础入门(2)

目录 一、绘图 1.曲线图 curve() 函数 2.加参考线 abline() 3.条形图 barplot() 4.散点图 plot() 练习&#xff1a; 二、读取csv文件 1.表格数据 2.读入表格数据 3.分类变量频数统计 4.数值型变量的统计 三、调用自定义函数 一、绘图 1.曲线图 curve() 函数 用 …

【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)

目录 1.说明 ​2.python实现 1.说明 巴斯卡三角形又叫杨辉三角&#xff0c;贾宪三角形 他有以下 性质&#xff1a; 前提&#xff1a;端点的数为1&#xff08;这不是废话吗&#xff0c;头上那个端点不是1还是三角形吗&#xff09; 1、每个数等于它上方两数之和。 2、每行数…

C语言多功能计算器

最近经过一段时间的C语言学习&#xff0c;我使用C语言制作了一个多功能计算器&#xff0c;想要给大家分享一下。 计算器设计流程 1 . 实现基本的加减乘除运算。 2 . 能够实现开方&#xff0c;立方&#xff0c;平方等复杂运算。 3 . 整体的界面展示&#xff0c;显示更加清晰易…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

C语言颜色设置

C语言文字颜色和背景颜色设置 代码 #include <stdio.h> #include <stdlib.h>int main() {system("color 11") //背景色和文字颜色system("pause")&#xff1b;return 0; }如上代码是输出蓝色背景和蓝色文字。 在所需要改变窗口颜色的位置调…

因子分析——matlab

目录 一、起源 二、基本思想 三、算法用途 四、实例详解 1.读取数据 2.数据标准化 3.两种不同的做法 3.1 不用函数 3.2 factoran()法 4.对因子得分进行排序 5.对因子得分进行画图 一、起源 因子分析的起源是这样的&#xff1a;1904年英国的一个心理学家发现学生的英…

因子分析——python

目录 一、起源 二、基本思想 三、算法用途 四、因子分析步骤 五、factor_analyzer库 四、实例详解 1.导入库 2.读取数据 3.充分性检测 3.1 Bartletts球状检验 3.2 KMO检验 4.选择因子个数 4.1 特征值和特征向量 4.2 可视化展示 4.3 可视化中显示中文不报错 5.因…

【蓝桥杯每日一练】 三色旗

目录 1.说明 2.解法 3.python实现 第一种 第二种 第三种 1.说明 三色旗的问题最早由E.W.Dijkstra所提出&#xff0c;他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人)&#xff0c;而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子&#xff0c;上面有红…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

熵权法 —— python

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 四、实例分析 1.导入相关库 2.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.…

R语言基础入门(3)之数据类型与相应运算1

目录 一、常量与变量 1.常量 2.变量 二、数据类型 三、数值型向量 3.1 c() 函数 3.2 length(x) 3.3 numeric() 四、向量运算 1.标量和标量运算 2.向量与标量运算 3.等长向量运算 4.不等长向量的运算 五、向量函数 1.向量化的函数 2.排序函数 3.统计函数…

C语言位运算详解

C语言位运算包括&#xff1a;按位与运算、或运算、异或运算、左移运算、右移运算。 位运算&#xff0c;就是对一个比特&#xff08;Bit&#xff09;位进行操作。比特&#xff08;Bit&#xff09;是一个电子元器件&#xff0c;8个比特构成一个字节&#xff08;Byte&#xff09;…

R语言基础入门(4)之数据类型与相应运算2

目录 一、逻辑型向量与比较运算 二、 逻辑运算 三、逻辑运算函数 一、逻辑型向量与比较运算 逻辑型是 R 的基本数据类型之一&#xff0c;只有两个值 TRUE 和 FALSE, 缺失时为 NA。逻辑值一般产生自比较&#xff0c;如sele <- (log10(15) < 2); print(sele) 返回&…

R语言基入门(5)之字符型数据及其处理

目录 1.字符型向量 2. paste() 函数 3.转换大小写 4.字符串长度 5.取子串 6. 类型转换 7. 字符串拆分 8.字符串替换功能 9.正则表达式 1.字符型向量 字符型向量是元素为字符串的向量。如s <- c(abc, , a cat, NA, 李明) s 返回&#xff1a; 2. paste() 函数 针对…

R语言基础入门(6)之向量下标和子集

目录 1.正整数下标 2.负整数下标 3.空下标与零下标 4.下标超界 5.逻辑下标 6. which()、which.min()、which.max() 函数 7. 元素名 8.用 R 向量下标作映射 9.集合运算 练习 1.正整数下标 首先定义一个x&#xff0c;然后对向量 x, 在后面加方括号和下标可以访问向量…