python中xpath的基本使用

写在前面的话上一篇文章我们利用requests进行了一些爬虫小实验,但是想要更顺利的深入爬虫学习,了解一些解析网页的方法肯定是必须的,所以接下来我们就一起来学习lxml.etree模块的基础使用方法吧

温馨提示 :博主使用的系统为win10,使用的python版本为3.6.5

一、XPATH简介

若想了解xpath,我们首先需要知道什么是xml文档,其实简单地说,xml文档就是由一系列节点构成的树,例如

<html>
    <body>
        <div>
            <p>Hello world<p>
            <a href="/home">Click here</a>
        </div>
    </body>
</html>

xml文档常见的节点有

  • 根节点:html
  • 元素节点:html、body、div、p、a
  • 属性节点:href
  • 文本节点:Hello world、Click here

xml文档常见的节点间关系有

  • 父子:p和a是div的子节点,反之,div是p和a的父节点
  • 兄弟:p和a为兄弟节点
  • 祖先/后代:body、div、p、a都是html的后裔节点,反之,html是body、div、p、a的祖先节点

而xpath则是一种用来确定xml文档中某部分位置的语言,它的全称是XML路径语言(XML Path Language),对于网页解析来说,xpath比正则表达式来得更方便更简洁,故python中专门提供了一个特殊的模块——lxml库中的etree模块用于处理xpath,我们可以使用以下命令进行安装

$ pip install lxml

二、XPATH的基本使用方法

1. 导入模块

>>> from lxml import etree

在这里为了简便起见,我们自己构造一个简单的xml文档

>>> sc = ‘‘‘
<html>
    <head>
        <meta charset=UTF-8>
        <link rel=stylesheet href=style/base.css>
        <link rel=stylesheet href=style/home.css>
        <base href="https://www.example.com"/>
        <title>Example website</title>
    <body>
        <div id="images" class="content">
            <a href="image1.html">Image1<br/><img src="image1.jpg"/>
            <a href="image2.html">Image2<br/><img src="image2.jpg"/>
            <a href="image3.html">Image3<br/><img src="image3.jpg"/>
            <a href="image4.html">Image4<br/><img src="image4.jpg"/>
            <a href="image5.html">Image5<br/><img src="image5.jpg"/>
‘‘‘

2. 构造_Element对象

#可以使用HTML()方法构造_Element对象并自动补全不完整代码
>>> html = etree.HTML(sc)
#构造对象结果检查
>>> type(html)
<class ‘lxml.etree._Element‘>
#补全代码结果检查,注意tostring()方法用于将_Element对象转化成bytes类型字符串,decode(‘utf-8‘)方法用于将bytes类型字符串转化为str类型字符串
>>> print(etree.tostring(html).decode(‘utf-8‘))
<html>
    <head>
        <meta charset="UTF-8"/>
        <link rel="stylesheet" href="style/base.css"/>
        <link rel="stylesheet" href="style/home.css"/>
        <base href="https://www.example.com"/>
        <title>Example website</title>
    </head>
    <body>
        <div id="images" class="content">
            <a href="image1.html">Image1<br/><img src="image1.jpg"/></a>
            <a href="image2.html">Image2<br/><img src="image2.jpg"/></a>
            <a href="image3.html">Image3<br/><img src="image3.jpg"/></a>
            <a href="image5.html">Image5<br/><img src="image5.jpg"/></a>
        </div>
    </body>
</html>

3. 匹配结果

可以使用xpath()方法进行匹配,注意该方法返回匹配列表,且列表中的每一项都是_Element对象

(1)/ 表示子代,例如E1/E2表示E1子节点中的E2节点,/E表示文档子节点中的E节点

>>> test = html.xpath(‘/html/body/div/a‘)
>>> print(test)
[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]

(2)// 表示后代,例如E1//E2表示E1后代节点中的E2节点,//E表示文档后代节点中的E节点

>>> test = html.xpath(‘//a‘)
>>> print(test)
[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]

(3)* 表示属性节点,例如E/*表示E子节点中的所有节点

>>> test = html.xpath(‘/html/*‘)
>>> print(test)
[<Element head at 0x3843be8>, <Element body at 0x3843c10>]

(4)text() 表示文本节点,例如E/text()表示E子节点中的文本节点

>>> test = html.xpath(‘/html/head/title/text()‘)
>>> print(test)
[‘Example website‘]

(5)@ATTR 表示属性节点,例如E/@ATTR表示E子节点中的ATTR属性节点

>>> test = html.xpath(‘//a/@href‘)
>>> print(test)
[‘image1.html‘, ‘image2.html‘, ‘image3.html‘, ‘image4.html‘, ‘image5.html‘]

(6)谓语 用于匹配指定的标签

#指定第二个a标签
>>> test = html.xpath(‘//a[2]‘)
>>> print(test)
[<Element a at 0x3843c88>]

#指定前两个a标签
>>> test = html.xpath(‘//a[position()<=2]‘)
>>> print(test)
[<Element a at 0x3843c60>, <Element a at 0x3843c88>]

#指定带有href属性的a标签
>>> test = html.xpath(‘//a[@href]‘)
>>> print(test)
[<Element a at 0x3843c38>, <Element a at 0x385c300>, <Element a at 0x385c2d8>, <Element a at 0x385c350>, <Element a at 0x385c328>]

#指定带有href属性且值为image1.html的a标签
>>> test = html.xpath(‘//a[@href="image1.html"]‘)
>>> print(test)
[<Element a at 0x3843c38>]

4. _Element对象的常用属性与方法

我们先用xpath()方法得到匹配列表tests,tests中的每一项都是一个 _Element对象

>>> tests = html.xpath(‘//a‘)

(1)属性tag 返回标签名

>>> for test in tests:
        test.tag
‘a‘
‘a‘
‘a‘
‘a‘
‘a‘

(2)属性 attrib 返回属性与值组成的字典

>>> for test in tests:
        test.attrib
{‘href‘: ‘image1.html‘}
{‘href‘: ‘image2.html‘}
{‘href‘: ‘image3.html‘}
{‘href‘: ‘image4.html‘}
{‘href‘: ‘image5.html‘}

(3)方法 get() 返回指定属性的值

>>> for test in tests:
        test.get(‘href‘)
‘image1.html‘
‘image2.html‘
‘image3.html‘
‘image4.html‘
‘image5.html‘

(4)属性 text 返回文本值

>>> for test in tests:
        test.text
‘Image1‘
‘Image2‘
‘Image3‘
‘Image4‘
‘Image5‘

写在后面的话 :现在我们已经学习完requests和lxml.etree模块的基础使用方法了,下一篇文章我们将利用它们进行一个基础的爬虫实战训练,谢谢大家

原文地址:https://www.cnblogs.com/wsmrzx/p/9520942.html

时间: 2024-08-01 14:55:25

python中xpath的基本使用的相关文章

Python中xPath技术和BeautifulSoup的使用

xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 /    : 表示从根节点选取 //   :选择任意位置的某个节点.            .  :选取当前节点           ..   :选取当前节点的父节点 @   :选取属性    谓语实例 实现效果                                                                 路劲表

python selenium xpath定位时使用变量

driver.find_element_by_xpath(input[@id = "kw"]) 上面的代码,相信很多学习selenium + python 的朋友都很熟悉,就是定位百度首页搜索框的代码,如果我们想把"kw",用一个变量来表示该怎么操作呢? 目前,我知道的有两种方法,如下,是定位百度搜索框,点击搜索的代码,在XPath定位的过程中,用了变量: # encoding:utf-8 from selenium import webdriver import

在Python中实现PageFactory模式

关于 PageFactory 的概念主要是Java中内置了PageFactory类. import org.openqa.selenium.support.PageFactory; …… 例子,http://libin0019.iteye.com/blog/1260090 Python(Selenium)中没有这个类. PageFactory 的概念和Page Object应该类似,属于一种设计模式.所以并不局限于语言及场景.于是,好奇,既然Java有,那Python也应该有类似的玩法.还真让我

python中lxml的应用

首先下载lxml, http://www.lfd.uci.edu/~gohlke/pythonlibs/ ,然后添加引用 from lxml import _elementpath as DONTUSE from lxml import etree 具体示例: 1.添加命名空间 #set namespace nsmap = {"xsi": "http://www.w3.org/2001/XMLSchema-instance" } g_statisticsRoot =

转在Python中实现PageFactory模式

转自: http://www.cnblogs.com/fnng/p/5092383.html 关于 PageFactory 的概念主要是Java中内置了PageFactory类. import org.openqa.selenium.support.PageFactory; …… 例子,http://libin0019.iteye.com/blog/1260090 Python(Selenium)中没有这个类. PageFactory 的概念和Page Object应该类似,属于一种设计模式.所

python爬虫xpath的语法

python爬虫xpath的语法 有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上. 因此,对 XPath 的理解是很多高级 XML 应用的基础. 这个是w3c上关于xpath的介绍,可以看出xp

走入计算机的第四十天(python中sockserver模块)

一.Python中的sockserver模块 1.该模块与sock模块不同之处是该模块自动帮我们分装好了一些功能,让我们在编程的时候直接调用这些功能就可以了,节省了编程步骤. 2.如图所示 注释:上图为服务端设置 该模块的操作方法比较死板,我们只要会熟悉的使用他就可以了.

python中if __name__ == &#39;__main__&#39;:

Using a module's __name__ Example? 8.2.? Using a module's __name__ #!/usr/bin/python # Filename: using_name.py if __name__ == '__main__': print 'This program is being run by itself' else: print 'I am being imported from another module' Output $ pytho

关于Python中的yield

关于Python中的yield http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器是一个实现了迭代器协议