Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。

学习Xpath爬虫,我们首先学习一下python中lxml库

关于库

lxml

终端下载Xpath需要用到的模块

pip install lxml

关于HTML

超文本标记语言,是用来描述网页的一种语言。主要用于控制数据的显示和外观。HTML文档一定意义上可以被称为网页。但反过来说网页不仅仅是HTML,网页本质有三部分构成:负责内容结构的HTML,负责表现的CSS,以及负责行为的javascript。本文主要分享的是最核心的内容结构部分。

html结构

完整的HTML文件至少包括标签、标签、标签和标签,并且这些标签都是成对出现的,开头标签为<>,结束标签为</>,在这两个标签之间添加内容。通过这些标签中的相关属性可以设置页面的背景色、背景图像等。

例如,我们打开 汽车之家 首页,摁下键盘上的F12键,打开浏览器自带"开发者工具",可以看到一个完整的html文档结构,如下图

打开 中图网 首页,摁下键盘上的F12键,打开浏览器自带"开发者工具",可以看到一个完整的html文档结构,如下图

从上图可以看出,一个完整的html文档主要包含三部分:DTD文档头,head头部信息和body正文信息。其中DTD文档头用来告诉浏览器执行标准是什么(比如html4或是html5),head头部信息用来说明浏览器的编码方式和文档头名称,body顾名思义就是浏览器的正文部分。

html标签

作为开始和结束的标记,由尖括号包围的关键词,比如 ,标签对中的第一个标签是开始标签,第二个标签是结束标签。html中常见标签如下:

其中, "< ul >< li >"是一种嵌套顺序,无序列表,成对出现;

li的父元素必须是ul或者ol,不同之处在于ol是一种有序列列表,而ul是无序列表;

html属性

属性是用来修饰标签的,放在开始标签里里面,html中常见四大属性:

属性 说明
class 规定元素的类名,大多数时候用于指定样式表中的类
id 唯一标识一个元素的属性,在html里面必须是唯一的
href 指定超链接目标的url
src 指定图像的url

Xpath

xpath常见使用方法
符号 功能
// 表示在整个文本中查找,是一种相对路径
/ 表示则表示从根节点开始查找,是一种绝对路径
text() 找出文本值
@ 找出标签对应的属性值,比如@href就是找出对应的href链接
. 表示当前节点
... 表示当前节点的父节点

举个例子,定位中图网中图书畅销榜TOP1000书本的位置。

2024年畅销图书排行榜_图书销量排行榜_中图网

定位TOP1图书

在开发者工具这一侧按住ctrl+F,在浮出的搜索栏里依次输入我们找到top1图书的位置

/html/body/div@class='content'/div/div@class='container'/div/div@class='listLeft'/div@class='bookList'/ul/li

这是绝对路径,也就是完整路径。

我们也可以通过相对路径//定位到第一本书

//div@class='listMainclearfix'/div2/div2/ul/li

特别注意:通过相对路径找到的路径,用//开始 ,且//后面的标签是唯一的。可以在ctrl+F浮出的搜索栏里查询该标识符是否出现且唯一

这样我们就在HTML里顺利的找到TOP1的位置啦!

当然 Xpath除了上述常见用法外,还存在两种比较特殊的用法:

  • 以相同的字符开头

用法1:以相同的字符开头:starts-with(@属性部分,属性字符相同部分

python 复制代码
#例子1:
from lxml import etree
html1 = """
<!DOCTYPE html>
<html>
 <head lang='en'>
    <meta charest='utf-8'>
    <title></title>
 </head>
 <body>
    <div id="aaa">哇哈哈</div>
    <div id="bbb">爽歪歪</div>
    <div id="ccc">营养快线</div>
 </body>
</html>
"""

# 将符合html格式的字符串转成可以编写xpath语法的格式
info1 = etree.HTML(html1)

res1 = info1.xpath('//div[1]/text()')
print(res1, type(res1))
print('------------------')
res2 = info1.xpath('//div[2]/text()')
print(res2, type(res2))
print('------------------')
res3 = info1.xpath('//div[3]/text()')
print(res3, type(res3))
  • 标签套标签

用法2:标签套标签:string(.)

python 复制代码
#例子2:
from lxml import etree
html2 = """
<!DOCTYPE html>
<html>
 <head lang='en'>
    <meta charest='utf-8'>
    <title></title>
 </head>
 <body>
    <div id="test3">
    我左青龙,
        <span id='tiger'>
            右白虎
            <ul>上朱雀,
                <li>下玄武,</li>
            </ul>
        </span>
        龙头在胸口
    </div>
 </body>
</html>
"""
info2 = etree.HTML(html2)
res1 = str(info2.xpath('string(.)'))
res1 = res1.replace("\n","").replace(" ","").replace("\t","")
print(res1)
xpath的谓语结构

所谓"谓语条件",就是对路径表达式的附加条件。所有的条件,都写在方括号"\[\]"中,表示对节点进行进一步的筛选。例如:

xml 复制代码
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
     <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
     <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>

下面从几个简单的例子让大家体会一下

  • /bookstore/book1 :表示选择bookstore的第一个book子元素。
  • /bookstore/booklast() :表示选择bookstore的最后一个book子元素。
  • /bookstore/booklast()-1 :表示选择bookstore的倒数第二个book子元素。
  • /bookstore/bookposition()\< 3 :表示选择bookstore的前两个book子元素。
  • //title@lang :表示选择所有具有lang属性的title节点。
  • //title@lang='eng' :表示选择所有lang属性的值等于"eng"的title节点。
函数 说明 举例
contains 选取属性或者文本包含某些字符 //divcontains(@id, 'data') 选取 id 属性包含 data 的 div 元素 //divcontains(string(), '支付宝') 选取内部文本包含"支付宝"的 div 元素
starts-with 选取属性或者文本以某些字符开头 //divstarts-with(@id, 'data') 选取 id 属性以 data 开头的 div 元素 //divstarts-with(string(), '银联') 选取内部文本以"银联"开头的 div 元素
ends-with 选取属性或者文本以某些字符开头 //divends-with(@id, 'require') 选取 id 属性以 require 结尾的 div 元素 //divends-with(string(), '支付') 选取内部文本以"支付"结尾的 div 元素

学习了Xpath定位后,我们下一篇将用Xpath方法爬取中图网TOP1000的图书信息啦!

相关推荐
我不会起名字3227 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
爱吃苹果的梨叔7 小时前
AI 算力监控中心怎么建?分布式坐席 + 大屏联动 + 过程回放
人工智能·分布式·python
JarmanYuo7 小时前
YOLO 涨点研究(六):网络结构改进之小目标增强篇1——无人机视角下的车辆与行人检测
人工智能·pytorch·python·yolo·计算机视觉·无人机
susplus7 小时前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
2601_962297257 小时前
python自带缓存lru_cache用法及扩展的使用_python
python·缓存·装饰器·lru_cache·my_cache
招财小梗7 小时前
沈阳AI企业咨询可定制数字化方案吗?
大数据·人工智能·python
leihefeng8 小时前
邮件文本分类:CountVectorizer / TF-IDF + 朴素贝叶斯
python·分类·数据挖掘·tf-idf·sklearn
码艺-Alimjan8 小时前
维吾尔语数字转文本
java·javascript·python·算法·go
天空属于哈夫克38 小时前
企业微信 API 自动发送消息:从流程到实战
python·自动化·企业微信
SunnyDays10118 小时前
如何使用 Python 给 PDF 添加附件:文档附件与附件注释
开发语言·python·pdf