使用XPath来解析网页数据

阅读指导:
这篇文章详细讲解了XPath解析的方法。每个方法都配有相应的代码示例,读者可以通过本文更深入地了解XPath。由于文章篇幅较长,建议通过目录选择您感兴趣的部分进行学习。

1. XPath

       XPath(XML Path Language)是一种用于在 XML 文档中查找和选取节点的语言。它提供了一种通过路径表达式来导航 XML 文档的方法。

其优点在于:

  • 强大的定位能力
  • 灵活的路径表达式
  • 高效的节点选择

1.1 节点的访问

1.1.1 节点的访问规则

表达式描述
//从当前节点,选取其子孙结点
/从当前节点,选取其直接子节点
.选取当前节点
..选取当前节点的父节点
@选取属性
nodename选取此节点的所有子节点

1.1.2 访问所有节点

通过 // 方式来获取所有符合要求的结点
比如:
//* 选取所有节点
//li 选取所有 li 节点
//ul 选取所有 ul 节点
//a 选取多有 a 节点

获取到节点后,返回的是列表元素,每个元素都是ELement类型,可以通过索引的方式获取

示例HTML:

<!-- ./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>

获取 li 元素下的 a 元素

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li')
print(result)
print(type(result))
print(result[0])

输出:

[<Element li at 0x1905f6f6640>, <Element li at 0x1905f6f6680>, <Element li at 0x1905f6f66c0>, <Element li at 0x1905f6f6700>, <Element li at 0x1905f6f6740>]
<class 'list'>
<Element li at 0x1905f6f6640>

1.1.3 子节点

通过 / 和 // 来获取当前元素的子,子孙节点
但是要注意
/ 只获取直接子节点, // 用于获取子孙节点

获取所有 li 元素的 a 标签

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a')
print(result)
print(result[0])

输出:

[<Element a at 0x1a676cd6500>, <Element a at 0x1a676cd6540>, <Element a at 0x1a676cd6580>, <Element a at 0x1a676cd65c0>, <Element a at 0x1a676cd6600>]
<Element a at 0x1a676cd6500>

1.1.4 父节点

通过 .. 的方式获取

比如:
获取 li 的class属性值

 <li class="item-1"><a href="link4.html">fourth item</a></li>

获取代码:

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

输出:

['item-1']

代码解释:
       首先是定位到超链接为“link4.html”的 a 标签,然后向上翻一级,也就是到了 li 元素,然后再查找这个 a 标签对应的 li 的 class 属性值,即最后的输出为[‘item-1’]

1.2.属性访问

1.2.1 属性匹配

       像1.1.4所示,该节点使用 @ 符号来定位其属性,所以通过 @ 符号可以实现属性的过滤。

基本语法:[@a = “b”]
比如 [@class = “abc”],[@herf= “link”]

例:
获取class为“item-0”的 li 标签

<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>

获取代码:

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)

输出:

[<Element li at 0x1d7dde06680>, <Element li at 0x1d7dde066c0>]

1.2.2 属性值获取

属性值的获取也是用 @ 符号,但是与属性匹配不同的是,属性匹配需要用总括号加属性名和值来限定某个属性

获取所有 li 标签下的 a 标签的 herf 的值

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)

输出:

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']

1.2.3 属性多值匹配

对于一个节点的某个属性含多个属性值时,使用contains方法定位元素。
contains()传两个参数,第一个是属性名,第二个是属性名中的其中一个属性值。

例:
获取class属性值里面含 “li” 的 li 标签的 a 标签下的文字

<!--./text-->
<li class="li li-first"><a href="link.html">first item</a></li>

获取代码:

from lxml import etree
html = etree.HTML(./text)
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

输出:

['first item']

1.2.4 多属性匹配

对于一个节点具有多个属性时,使用 and 运算符连接多个属性

例:
获取class属性值含 “li” 和 name 属性值为 “item” 的 li 标签下的 a 标签的文字部分

<!--./text-->
<li class="li li-first" name="item"><a href="link.html">first item</a></li>

获取代码:

from lxml import etree
html = etree.HTML(./text)
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)

输出:

['first item']

1.3 节点的选择

当某个属性对应多个节点时,就需要对节点进行选择

1.3.1 按序选择

字面意思,即是通过索引的方式进行选择,但是不同于代码思维的一点就是,索引的第一个数是1,不是0

例:
以索引的形式,获取 li 标签下的 a 标签的文字内容

<!--./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>

获取代码:

from lxml import etree
html = etree.HTML(./text)
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)

输出:

['first item']
['fifth item']
['first item', 'second item']
['third item']

1.4 文本获取

<!-- ./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>

使用text()方式,获取该元素下的直接文字内容
比较下面三种方式获取文字的信息

获取代码:

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())

result = html.xpath('//li[@class="item-0"]/text()')
print(result)

result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)

result = html.xpath('//li[@class="item-0"]//text()')
print(result)

输出:

['\n     ']
['first item', 'fifth item']
['first item', 'fifth item', '\n     ']

代码解释:
       第一种是访问class属性为“item-0”的 li 标签下的文字,但是在这行代码里面,li 标签的下一级是 a 标签,没有文字,只有换行符,所以输出也就是['\n ']
       第二种这是访问class属性为“item-0”的 li 标签的 a 标签下的文字,所以输出是[‘first item’, ‘fifth item’]
       第三种是访问class属性为“item-0”的 li 标签下所有子孙节点的文本,同时也包含了转义字符,所以输出为[‘first item’, ‘fifth item’, '\n ']

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
### 回答1: 使用pyquery可以通过CSS选择器或XPath表达式来查找HTML文档中的元素,从而提取所需的数据。具体步骤如下: 1. 导入pyquery库:`from pyquery import PyQuery as pq` 2. 加载HTML文档:`doc = pq(html)` 3. 使用CSS选择器或XPath表达式查找元素:`doc('selector')`或`doc.xpath('xpath_expression')` 4. 提取元素的文本内容、属性值等数据:`element.text()`或`element.attr('attribute_name')` 例如,假设我们要从以下HTML文档中提取所有链接的URL地址: ```html <html> <body> <a href="https://www.baidu.com">百度</a> <a href="https://www.google.com">谷歌</a> <a href="https://www.bing.com">必应</a> </body> </html> ``` 可以使用以下代码实现: ```python from pyquery import PyQuery as pq html = ''' <html> <body> <a href="https://www.baidu.com">百度</a> <a href="https://www.google.com">谷歌</a> <a href="https://www.bing.com">必应</a> </body> </html> ''' doc = pq(html) links = doc('a') # 使用CSS选择器查找所有<a>元素 for link in links: url = pq(link).attr('href') # 提取<a>元素的href属性值 print(url) ``` 输出结果为: ``` https://www.baidu.com https://www.google.com https://www.bing.com ``` ### 回答2: Python爬虫是目前互联网上非常常见的一种数据采集方式,通过Python程序代码模拟人类浏览器行为,从目标网站上自动抓取所需数据。爬虫数据提取方式有很多种,其中比较流行的一种方式就是使用pyquery查找元素。 pyquery是Python的一种强大的解析html和xml文档的库,它采用了jQuery风格的语法,对于提取数据非常方便快捷。下面我们来介绍pyquery的用法。 1. 安装pyquery库:使用pip命令可以很方便地安装pyquery库,如下所示: ``` pip install pyquery ``` 2. 导入pyquery库:在Python程序代码中导入pyquery库,如下所示: ``` from pyquery import PyQuery as pq ``` 3. 初始化pyquery对象:通过url或html文本初始化pyquery对象,如下所示: 通过url初始化: ``` doc = pq(url='http://www.baidu.com') ``` 通过html文本初始化: ``` html = ''' <html> <head> <title>python爬虫数据提取方式——使用pyquery查找元素</title> </head> <body> <div class="content" id="content-div"> <p>这是一个示例文本</p> </div> </body> </html> ''' doc = pq(html) ``` 4. 查找元素:使用find、children、siblings等方法查找元素,如下所示: 查找元素: ``` p = doc('p') ``` 查找元素属性值: ``` div_id = doc('#content-div').attr('id') ``` 5. 获取元素内容:使用text、html方法获取元素内容,如下所示: 获取文本内容: ``` p_text = p.text() ``` 获取html内容: ``` div_html = doc('#content-div').html() ``` 总之,pyquery是Python爬虫数据提取中很实用的一种工具,通过它可以快速方便地获取到所需数据。在使用pyquery时,需要了解基础的HTML语法,并掌握pyquery中的各种查找、遍历和属性操作方法。 ### 回答3: Python爬虫数据提取方式之一是使用pyquery查找元素。Pyquery是一个Python库,它是在jQuery的基础上构建的,可以用来解析和操作HTML文档。使用Pyquery可以方便快捷地从网页中提取需要的数据使用Pyquery查找元素的过程分为以下几步: 第一步是获取网页源代码。通常情况下,可以使用Python Requests库获取网页源代码,并将其保存为一个字符串类型的变量。 第二步是使用Pyquery构建doc对象。使用Pyquery的from_string()方法可以将网页源代码转换为Pyquery类型的对象。 第三步是通过选择器选取元素。类似于使用jQuery选择器选取元素一样,使用Pyquery的find()方法和eq()方法可以选取需要的元素。 第四步是获取元素的属性或文本值。使用Pyquery的attr()方法可以获取元素的属性值,text()方法可以获取元素的文本值。 最后是对获取的数据进行处理和存储。可以使用Python的各种数据处理和存储工具对获取的数据进行处理和存储,例如使用Pandas库进行数据分析和处理,使用MySQL或MongoDB等数据库进行数据存储。 总之,使用Pyquery查找元素是Python爬虫重要的数据提取方式之一,通过选取网页中需要的元素,并获取其属性或文本值,可以快速而准确地抓取数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值