xpath安装(如何在python中使用xpath)

本文目录
- 如何在python中使用xpath
- chrome xpath插件怎么用
- 如何安装python中的parsel
- 如何自动获取网页页面元素的xpath
- kibana xpath的安装与使用
- 安装不了xpath helper插件怎么办
- Python解析库lxml与xpath用法总结
- python使用xpath(超详细)
如何在python中使用xpath
在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxml.html的xpath对html进行分析,获取抓取信息。
首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上被推荐的python binding是lxml,也有beautifulsoup,不嫌麻烦的话还可以自己用正则表达式去构建,本文以lxml为例讲解。
假设有如下的HTML文档:
1 《html》
2 《body》
3 《form》
4 《div id=’leftmenu’》
5 《h3》text《/h3》
6 《ul id=’china’》《!-- first location --》
7 《li》...《/li》
8 《li》...《/li》
9 ......
10 《/ul》
11 《ul id=’england’》《!-- second location--》
12 《li》...《/li》
13 《li》...《/li》
14 ......
15 《/ul》
16 《/div》
17 《/form》
18 《/body》
19 《/html》
直接使用lxml处理:
1 import codecs
2 from lxml import etree
3 f=codecs.open("ceshi.html","r","utf-8")
4 content=f.read()
5 f.close()
6 tree=etree.HTML(content)
etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了,是不是有点小激动,现在就尝试下吧。
在使用xpath之前我们先来看看作为对照的jQuery和RE。
在jQuery里要处理这种东西就很简单,特别是假如那个ul节点有id的话(比如是《ul id=’china’》):
$("#china").each(function(){...});
具体到此处是:
$("#leftmenu").children("h3:contains(’text’)").next("ul").each(function(){...});
找到id为leftmenu的节点,在其下找到一个内容包含为”text”的h3节点,再取其接下来的一个ul节点。
在python里要是用RE来处理就略麻烦一些:
block_pattern=re.compile(u"《h3》档案《/h3》(.*?)《h3》", re.I | re.S)
m=block_pattern.findall(content)
item_pattern=re.compile(u"《li》(.*?)《/li》", re.I | re.S)
items=item_pattern.findall(m)
for i in items:
print i
那么用xpath要怎么做呢?其实跟jQuery是差不多的:
nodes=tree.xpath("/descendant::ul")
当然,现在没有id的话也就只能用类似于jQuery的方法了。完整的xpath应该是这样写的(注意,原文件中的TAG有大小写的情况,但是在XPATH里只能用小写):
nodes=tree.xpath(u"/html/body/form/div")
更简单的方法就是像jQuery那样直接根据id定位:
nodes=tree.xpath(u"//div")
这两种方法返回的结果中,nodes就是那个“text”的h3节点后面紧跟的第一个ul节点,这样就可以列出后面所有的ul节点内容了。
如果ul节点下面还有其他的节点,我们要找到更深节点的内容,如下的循环就是把这些节点的文本内容列出:
nodes=nodes.xpath("li/a")
for n in nodes:
print n.text
对比三种方法应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而RE则纯粹是基于plain text。RE对付简单的页面是没有问题,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的RE pattern可能会远比写一个xpath要复杂。特别是目前主流的基于CSS的页面设计方式,其中大部分关键节点都会有id――对于使用jQuery的页面来说则更是如此,这时xpath相比RE就有了决定性的优势。
附录:基本XPATH语法介绍,详细请参考XPath的官方文档
XPATH基本上是用一种类似目录树的方法来描述在XML文档中的路径。比如用“/”来作为上下层级间的分隔。第一个“/”表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。比如对于一个HTML文件来说,最外层的节点应该是”/html”。
同样的,“..”和“.”分别被用来表示父节点和本节点。
XPATH返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/html/head/scrpt”就会把head里的所有script节点都取出来。
为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“”,即可取出body里id为main的div节点。
其中@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class….
而 函数text()的意思则是取得节点包含的文本。比如:《div》hello《p》world《/p》《 /div》中,用”div“即可取得这个div,而world则是p的text()。
函数position()的意思是取得节点的位置。比如“li”。
不过要注意的是数字定位和过滤 条件的顺序。比如“ul/li”的意思就不同,它表示寻找ul下第五个name为”hello“的li节点。
此外,“*”可以代替所有的节点名,比如用”/html/body/*/span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。
而 “descendant::”前缀可以指代任意多层的中间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的 div,可以用“/descendant::div”。
至于“following-sibling::”前缀就如其名所说,表示同一层的下一个节点。”following-sibling::*”就是任意下一个节点,而“following-sibling::ul”就是下一个ul节点。
chrome xpath插件怎么用
1.打开chrome的配置页面 - 如下图 点击右上方的配置 - 工具 - 扩展程序
2.打开 扩展程序 页面 如下: 点击 下方的 获取更多扩展程序
3.打开 chrome 网上应用店 如下: 搜索 Xpath - 找到
xpathOnClick 和 PsychoXPath
点击 右边的 添加至CHROME
4.安装完成后 在浏览器的右上角会显示一个Xpath的图标:
在页面中 右键 增加PsychoXPath 选项 说明安装成功
如何安装python中的parsel
python-parsel
Parsel是一个使用XPath和CSS选择器(可选地与正则表达式结合)从HTML和XML提取数据的库
一、安装
***隐藏网址***
pip安装:pip install parsel 默认安装的是最新版
pip install parsel=1.6.0 目前官方最新版本
PyCharm:File =》Setting =》Project:sintemple =》 Project:Interpreter =》点击右上角的加号(或者按快捷键Alt+Insert)=》在输入框中输入parsel,会出现一个只有parsel的一列,点击选择它 =》Install Package 等待安装完成就可以了(注:其中Specify version选中可以在下拉框中选择版本)
————————————————
二、Selector
Selector(text=None, type=None, namespaces=None, root=None,base_url=None, _expr=None)
创建解析HTML或XML文本的对象
参数:
text 在python2中是一个Unicode对象,在python3中是一个str对象
type 定义Selector类型,可以是"html",“xml"或者是None(默认),如果为None则默认选择为"html”
base_url allows setting a URL for the document. This is needed when looking up external entities with relative paths(允许为文档设置URL。在使用相对路径查找外部实体时,这是必需的)
Selector的对象方法
①. Selector.attrib()
返回基础元素的属性字典
②. Selector.css(query)
css选择器
③. Selector.get()
序列化并以单个unicode字符串返回匹配的节点
④. Selector.getall()
序列化并以第1个元素的unicode字符串列表返回匹配的节点
⑤. Selector.re(self, regex, replace_entities=True)
正则选择器
⑥. Selector.re_first(self, regex, default=None, replace_entities=True)
If the list is empty or the regex doesn’t match anything, return the default value (None if the argument is not provided)如果列表为空或正则表达式不匹配任何东西,返回默认值(如果没有提供参数,则返回’None’ )
⑦. Selector.remove()
Remove matched nodes from the parent for each element in this list.从父节点中删除列表中每个元素的匹配节点。
⑧. Selector.xpath(self, query, namespaces=None, **kwargs)
xpath选择器
SelectorList的对象方法
SelectorList类是内置list类的一个子类,它提供了一些额外的方法。
①. attrib 返回第一个元素的属性字典。如果列表为空,则返回空dict
②. css(query) .css()对该列表中的每个元素调用方法,然后将其结果展平为另一个SelectorList。query 与 Selector.css()
③. extract() 调用.get()此列表中每个元素的方法,并将其结果展平,以unicode字符串列表形式返回。
④. extract_first(default=None) 返回.get()此列表中第一个元素的结果。如果列表为空,则返回默认值。
⑤. get(default=None) 返回.get()此列表中第一个元素的结果。如果列表为空,则返回默认值。
⑥. getall() 调用.get()此列表中每个元素的方法,并将其结果展平,以unicode字符串列表形式返回。
⑦. re(regex, replace_entities=True) 调用.re()此列表中每个元素的方法,并将其结果展平,以unicode字符串列表形式返回。默认情况下,字符实体引用由其对应的字符替换(&和和除外《。以传递replace_entities,False关闭这些替换。
⑧. re_first(regex, default=None, replace_entities=True) 调用.re()此列表中第一个元素的方法,并以Unicode字符串返回结果。如果列表为空或正则表达式不匹配任何内容,则返回默认值(None如果未提供参数)。默认情况下,字符实体引用由其对应的字符替换(&和和除外《。以传递replace_entities,False关闭这些替换。
⑨. remove() 从父级中删除此列表中每个元素的匹配节点。
⑩. xpath(xpath, namespaces=None, **kwargs) .xpath()对该列表中的每个元素调用方法,然后将其结果展平为另一个SelectorList。query 与 Selector.xpath()namespaces是用于将其他前缀添加到已注册的前缀的可选映射(字典)。与相对,这些前缀不会保存以备将来使用。
举例说明:
html代码
————————————————
三、csstranslator
TranslatorMixin
This mixin adds support to CSS pseudo elements via dynamic dispatch.Currently supported pseudo-elements are ::text and ::attr(ATTR_NAME).
①. xpath_attr_functional_pseudo_element(xpath, function)
Support selecting attribute values using ::attr() pseudo-element
②. xpath_element(selector)
③. xpath_pseudo_element(xpath, pseudo_element)
Dispatch method that transforms XPath to support pseudo-element
④. xpath_text_simple_pseudo_element(xpath)
Support selecting text nodes using ::text pseudo-element
XPathExpr(path=’’, element=’*’, condition=’’, star_prefix=False)
GenericTranslator
HTMLTranslator(xhtml=False)
四、utils
extract_regex(regex, text, replace_entities=True)
Extract a list of unicode strings from the given text/encoding using the following policies: * if the regex contains a named group called “extract” that will be returned * if the regex contains multiple numbered groups, all those will be returned (flattened) * if the regex doesn’t contain any group the entire regex matching is returned
flatten(sequence) → list
Returns a single, flat list which contains all elements retrieved from the sequence and all recursively contained sub-sequences (iterables). Examples: 》》》
iflatten(sequence) → Iterator
Similar to .flatten(), but returns iterator instead
shorten(text, width, suffix=’…’)
Truncate the given text to fit in the given width.
————————————————
原文链接:网页链接
如何自动获取网页页面元素的xpath
xpath获取步骤:
1、打开火狐浏览器;
2、选择 “打开菜单” -》 "附加组件" 如下图所示:
3、在 “搜素所有附加组件” 输入框中搜索Firebug
4、搜索到 Firebug 单击安装:
5、用以上方法搜索 FirePath 并安装:
6、重启浏览器,插件安装成功;
7、打开要获取Xpath的网页并进行一下操作,即可获得元素XPath:
kibana xpath的安装与使用
Kibana是一个为 ElasticSearch 提供的数据分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。
X-pack监控组件使您可以通过Kibana轻松地监控ElasticSearch。您可以实时查看集群的健康和性能,以及分析过去的集群、索引和节点度量。此外,您可以监视Kibana本身性能。当你安装X-pack在群集上,监控代理运行在每个节点上收集和指数指标从Elasticsearch。安装X-pack在Kibana上,您可以查看通过一套专门的仪表板监控数据。你可以选择性地安装X-pack这个插件:
以上就成功的在ES5.1中安装了X-PACK
以上就成功安装x-pack到Kibana
如果不需要该插件,也可以通过非常简单的方式删除:
bin/elasticsearch-plugin
remove x-pack
重启ElasticSearch
bin/kibana-plugin
remove x-pack
重启Kibana
以上安装之后,就会发现ES的访问和Kibana的访问都受到限制,需要账户,
那么默认的用户名和密码是多少呢
ElasticSearch:
用户名:elastic
密码:changeme
登录到Kibana会发现 elastic是一个最高级别的user,拥有所有权限,其角色是superuser。
当然在这里我们也可以添加自定义的用户,并为其分配角色,不同的角色对应不同的功能。
我们不仅可以通过kibana可视化的界面来管理用户
另外我们也可以通过ES的Reset Password API来管理用户。
修改了kibana的密码之后,还需要修改kibana.yml的配置文件中
***隐藏网址***
xpack 过期
加免费授权
***隐藏网址***
或者 disable xpack
disable xpack的方法:
在elasticsearch.yml里加这么一行 xpack.security.enabled: false,
我同时又在kibana.yml里加上xpack.security.enabled: false
安装不了xpath helper插件怎么办
安装方式一:直接拖拽你的xpath-helper.crx插件到谷歌浏览器的扩展程序里。使用快捷钱ctrl+shift+x调出插件,如果没有成功,安装方式二进行安装
安装方式二:把你的插件扩展名改成rar,然后解压。再重新添加到你的谷歌浏览的扩展程序里面。使用快捷键查看是否安装成功。
Python解析库lxml与xpath用法总结
本文主要围绕以xpath和lxml库进行展开:
一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符
二、lxml的安装、lxml的使用、lxml案例
一、xpath
1.xpath概念
XPath 是一门在 XML 文档中查找信息的语言。XPath 使用路径表达式在 XML 文档中进行导航 。XPath 包含一个标准函数库 。XPath 是 XSLT 中的主要元素 。XPath 是一个 W3C 标准 。
2.xpath节点
xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
节点关系:父、子、兄弟、先辈、后辈。
3.xpath语法
xpath语法在W3c网站上有详细的介绍,这里截取部分知识,供大家学习。
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。下面列出了最有用的路径表达式:
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
XPath 通配符可用来选取未知的 XML 元素。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
通过在路径表达式中使用"|"运算符,您可以选取若干个路径。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
4.xpath 轴
轴可定义相对于当前节点的节点集。
5.xpath运算符
下面列出了可用在 XPath 表达式中的运算符:
好了,xpath的内容就这么多了。接下来我们要介绍一个神器lxml,他的速度很快,曾经一直是我使用beautifulsoup时最钟爱的解析器,没有之一,因为他的速度的确比其他的html.parser 和html5lib快了许多。
二、lxml
1.lxml安装
lxml 是一个xpath格式解析模块,安装很方便,直接pip install lxml 或者easy_install lxml即可。
2.lxml 使用
lxml提供了两种解析网页的方式,一种是你解析自己写的离线网页时,另一种 则是解析线上网页。
导入包:
1.解析离线网页:
2.解析在线网页:
那么我们怎么获取这些标签和标签对应的属性值了,很简单,首先获取标签只需你这样做:
然后我们可以,比方说,你要获取a标签内的文本和它的属性href所对应的值,有两种方法,
1.表达式内获取
2.表达式外获取
这样就完成了获取,怎么样,是不是很简单了,哈哈哈。
下面再来lxml的解析规则:
3.lxml案例
为了偷懒,我决定还是采用urllib那篇文章的代码,哈哈哈,机智如我。
python使用xpath(超详细)
使用时先安装 lxml 包
开始使用 #
和beautifulsoup类似,首先我们需要得到一个文档树
把文本转换成一个文档树对象
from lxml import etreeif __name__ == ’__main__’:doc=’’’
把文件转换成一个文档树对象
fromlxmlimportetree# 读取外部文件 index.htmlhtml = etree.parse(’./index.html’)result = etree.tostring(html, pretty_print=True)#pretty_print=True 会格式化输出print(result)
均会打印出文档内容
节点、元素、属性、内容 #
xpath 的思想是通过 路径表达 去寻找节点。节点包括元素,属性,和内容
元素举例
html ---》...div ---》
这里我们可以看到,这里的元素和html中的标签一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用
路径表达式 #
/ 根节点,节点分隔符,// 任意位置. 当前节点.. 父级节点@ 属性
通配符 #
* 任意元素@* 任意属性node() 任意子节点(元素,属性,内容)
谓语 #
使用中括号来限定元素,称为谓语
//a price值大于2的元素
多个路径 #
用| 连接两个表达式,可以进行 或匹配
//book/title | //book/price
函数 #
***隐藏网址***
contains(string1,string2)
starts-with(string1,string2)
ends-with(string1,string2) #不支持
upper-case(string) #不支持
text()
last()
position()
node()
可以看到last()也是个函数,在前面我们在谓语中已经提到过了
案例 #
定位元素 #
匹配多个元素,返回列表
fromlxmlimportetreeif__name__ ==’__main__’:doc=’’’
【结果为】
#没找到p元素
html = etree.HTML(doc)print(etree.tostring(html.xpath("//li"))
【结果为】
b’ third item \n ’None #因为第三个li下面没有直接text,Nonethird item #
使用函数 #
contains #
有的时候,class作为选择条件的时候不合适@class=’....’ 这个是完全匹配,当王爷样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便
from lxml import etreeif __name__ == ’__main__’:doc=’’’
【结果为】
starts-with #
from lxml import etreeif __name__ == ’__main__’:doc=’’’
【结果为】
ends-with #
print(html.xpath("//*"))
【结果为】
Traceback (most recent call last):File"F:/OneDrive/pprojects/shoes-show-spider/test/xp5_test.py",line18,inprint(html.xpath("//*"))File"src\lxml\etree.pyx",line1582,inlxml.etree._Element.xpathFile"src\lxml\xpath.pxi",line305,inlxml.etree.XPathElementEvaluator.__call__File"src\lxml\xpath.pxi",line225,inlxml.etree._XPathEvaluatorBase._handle_resultlxml.etree.XPathEvalError: Unregisteredfunction
看来python的lxml并不支持有的xpath函数列表
upper-case #
和ends-with函数一样,也不支持。同样报错lxml.etree.XPathEvalError: Unregistered function
print(html.xpath("//a"))
text、last #
#最后一个li被限定了print(html.xpath("//li"))
【结果为】
position #
print(html.xpath("//li
上面这个例子我们之前以及讲解过了
* 这里有个疑问,就是position()函数能不能像text()那样用呢
print(html.xpath("//li/a/position()"))#结果 lxml.etree.XPathEvalError: Unregisteredfunction
这里我们得到一个结论,函数不是随意放在哪里都能得到自己想要的结果
node #
返回所有子节点,不管这个子节点是什么类型(熟悉,元素,内容)
print(html.xpath("//ul/li/node()"))print(html.xpath("//ul/node()"))
【结果为】
获取内容 #
**刚刚已经提到过,可以使用.text和text()的方式来获取元素的内容
from lxml import etreeif __name__ == ’__main__’:doc=’’’
【结果为】
看到这里,我们观察到text()和.text的区别。自己总结吧。不太好表达,就不表达了
获取属性 #
print(html.xpath("//a/@href"))print(html.xpath("//li/@class"))
【结果为】
自定义函数 #
***隐藏网址***
lxml supports XPath1.0, XSLT1.0andthe EXSLT extensions through libxml2andlibxsltina standards compliant way.
***隐藏网址***
from lxml import etree#定义函数def ends_with(context,s1,s2):return s1.endswith(s2)if __name__ == ’__main__’:doc=’’’
【结果为】
形参s1会传入xpath中的第一个参数@class,但这里注意@class是个列表
形参s2会传入xpath中的第二个参数’active’,’active’是个字符串
***隐藏网址***
defhello(context, a):return"Hello %s"% afromlxmlimportetreens = etree.FunctionNamespace(None)ns = helloroot = etree.XML(’《a》《b》Haegar《/b》《/a》’)print(root.xpath("hello(’Dr. Falken’)"))# 结果为 Hello Dr. Falken

更多文章:
root手机会有什么后果(我想开启root权限,那么做之后对手机有什么危害吗)
2026年9月7日 21:00
win7更新和安全在哪里(win7 64位 windows update更新存储文件位置在哪里 啊)
2026年9月7日 18:50
阿里旺旺苹果手机版(苹果iPhone 4手机能用阿里旺旺吗)
2026年9月7日 17:50
启动盘制作完成后怎么放入系统(u盘启动盘制作好了要怎么做才能装系统)
2026年9月7日 13:30
cpu天梯图2022年11月(2022手机cpu性能排行榜天梯图)
2026年9月7日 10:10




