一站式教你爬虫XPath(实战+全知识点)

张开发
2026/5/31 5:50:51 15 分钟阅读
一站式教你爬虫XPath(实战+全知识点)
XPathXML Path Language是一种用于在XML和HTML文档中定位节点的查询语言广泛应用于网页爬虫、自动化测试如Selenium、XML数据解析等场景。它通过路径表达式遍历文档树精准定位所需元素兼具简洁性和强大的查询能力。本文将全面梳理XPath核心知识点并结合实战案例帮助快速掌握其使用方法。一、XPath核心基础知识点1. 文档树结构XPath将XML/HTML文档视为一棵节点树所有元素、属性、文本、注释等都属于节点核心节点类型包括根节点整个文档的最顶层节点HTML文档中通常是XML文档中是根元素。元素节点文档中的标签如、、等是XPath定位的核心目标。属性节点元素的属性如中的href定位时需用符号标识。文本节点元素内的文本内容用text()函数获取。节点间存在层级关系父节点直接包含子节点的节点、子节点被父节点直接包含、同胞节点同一父节点下的节点、祖先节点父节点及以上的节点、后代节点子节点及以下的节点。2. 路径表达式核心语法XPath通过路径表达式定位节点核心语法分为绝对路径和相对路径搭配节点选择器使用常用表达式如下表达式说明示例/绝对路径从根节点开始定位/html/body/div 定位根节点下的html→body→div//相对路径从文档任意位置匹配节点最常用//div 定位所有div元素.当前节点./p 定位当前节点下的p元素…当前节点的父节点…/div 定位当前节点父节点下的div选择属性节点//a/href 获取所有a标签的href属性值3. 节点选择器常用结合路径表达式使用选择器精准定位节点常用类型如下1元素选择器直接通过标签名定位语法//标签名适用于标签唯一或批量获取同类标签。//div # 所有div元素 //a # 所有a标签 /html/body/p # 绝对路径定位body下的所有p标签2属性选择器通过元素的属性id、class、name等定位是最常用的定位方式支持多种匹配规则//div[idcontainer] # 定位id为container的div精准匹配 //input[nameusername] # 定位name为username的input //a[classlink and hrefhttps://xxx] # 多属性同时匹配and/or/not //div[contains(class, box)] # 模糊匹配class包含box的div //input[starts-with(id, user)] # 模糊匹配id以user开头的input //a[ends-with(href, .html)] # 模糊匹配href以.html结尾的a标签需XPath 2.03位置选择器通过节点在同胞中的位置定位适用于多个同类节点的场景//div[classlist]/li[1] # 定位list类div下的第1个li索引从1开始 //div[classlist]/li[last()] # 定位最后1个li //div[classlist]/li[last()-1] # 定位倒数第2个li //div[classlist]/li[position()3] # 定位前3个li4文本选择器通过元素内的文本内容定位使用text()函数//p[text()登录] # 定位文本内容为“登录”的p标签精准匹配 //a[contains(text(), 点击)] # 定位文本包含“点击”的a标签 //div[starts-with(text(), 欢迎)] # 定位文本以“欢迎”开头的div4. 常用函数实战必备XPath提供多种内置函数简化查询逻辑常用函数如下text()获取元素的文本内容属性名获取元素的指定属性值contains(节点, 匹配值)模糊匹配节点的文本或属性starts-with(节点, 匹配值)匹配以指定内容开头的节点last()返回同胞节点中的最后一个position()返回节点在同胞中的位置count(节点)统计匹配节点的数量normalize-space(节点)去除文本中的空格和换行count(//div[classitem]) # 统计class为item的div数量 normalize-space(//p[1]/text()) # 去除第一个p标签文本的空格 //input[contains(placeholder, 请输入)] # 匹配placeholder包含“请输入”的input5. 轴选择器进阶轴选择器用于定位节点的特定关系节点如祖先、后代、同胞语法轴名称::节点选择器常用轴如下//div[idbox]/child::li # 定位box的所有子li节点等同于//div[idbox]/li //div[idbox]/parent::div # 定位box的父div节点 //div[idbox]/sibling::div # 定位box的所有同胞div节点 //div[idbox]/ancestor::html # 定位box的祖先节点中的html节点 //div[idbox]/descendant::a # 定位box的所有后代a节点二、XPath实战应用核心场景以下实战场景基于Pythonlxml库解析HTML/XML和Selenium自动化测试覆盖爬虫、自动化测试两大核心用途所有代码可直接运行需提前安装依赖pip install lxml selenium。实战1HTML解析爬虫场景需求解析一个模拟的网页HTML提取商品名称、价格、链接等信息使用lxml库配合XPath定位。fromlxmlimportetree# 模拟网页HTML内容html !DOCTYPE html html langzh-CN headtitle商品列表/title/head body div classproduct-list div classproduct-item iditem1 a hrefhttps://xxx/item1.html classproduct-link h3 classproduct-name苹果14 Pro/h3 /a p classproduct-price7999/p /div div classproduct-item iditem2 a hrefhttps://xxx/item2.html classproduct-link h3 classproduct-name华为Mate 60/h3 /a p classproduct-price6999/p /div div classproduct-item iditem3 a hrefhttps://xxx/item3.html classproduct-link h3 classproduct-name小米14/h3 /a p classproduct-price4999/p /div /div /body /html # 解析HTMLtreeetree.HTML(html)# 1. 提取所有商品名称两种方式product_names1tree.xpath(//div[classproduct-item]/a/h3/text())product_names2tree.xpath(//h3[classproduct-name]/text())print(商品名称,product_names1)# 输出[苹果14 Pro, 华为Mate 60, 小米14]# 2. 提取所有商品价格去除符号product_pricestree.xpath(//p[classproduct-price]/text())product_prices[price.replace(,)forpriceinproduct_prices]print(商品价格,product_prices)# 输出[7999, 6999, 4999]# 3. 提取指定商品苹果14 Pro的链接target_linktree.xpath(//h3[text()苹果14 Pro]/parent::a/href)[0]print(苹果14 Pro链接,target_link)# 输出https://xxx/item1.html# 4. 统计商品数量product_counttree.xpath(count(//div[classproduct-item]))print(商品数量,int(product_count))# 输出3实战2Selenium自动化测试网页操作场景需求使用Selenium打开百度首页通过XPath定位搜索框、搜索按钮完成搜索操作验证搜索结果。fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByimporttime# 初始化浏览器Chromedriverwebdriver.Chrome()driver.get(https://www.baidu.com)driver.maximize_window()time.sleep(1)# 1. 定位搜索框输入“XPath教程”多种定位方式# 方式1通过id定位最精准search_inputdriver.find_element(By.XPATH,//input[idkw])# 方式2通过name定位# search_input driver.find_element(By.XPATH, //input[namewd])# 方式3通过class模糊匹配定位# search_input driver.find_element(By.XPATH, //input[contains(class, s_ipt)])search_input.send_keys(XPath教程)time.sleep(1)# 2. 定位搜索按钮点击搜索search_btndriver.find_element(By.XPATH,//input[idsu])# 也可以通过文本定位//input[value百度一下]search_btn.click()time.sleep(3)# 3. 验证搜索结果定位第一个搜索结果的标题first_resultdriver.find_element(By.XPATH,//div[idcontent_left]/div[1]/h3/a)print(第一个搜索结果标题,first_result.text)# 4. 关闭浏览器driver.quit()实战3复杂场景定位处理动态元素/嵌套元素需求定位嵌套在多层元素中的按钮处理动态生成的元素如分页按钮使用轴选择器和模糊匹配。# 场景1定位嵌套在多层div中的按钮相对路径轴选择器 //div[classcontainer]/descendant::button[contains(text(), 提交)] # 等同于//div[classcontainer]//button[contains(text(), 提交)] # 场景2定位动态生成的分页按钮第2页id动态变化如page-2、page-3 //div[classpagination]/button[contains(id, page-) and text()2] # 场景3定位当前节点的下一个同胞节点如选中项的下一个选项 //li[classactive]/following-sibling::li[1] # 场景4定位包含指定文本的父节点如找到文本为“登录”的元素定位其所在的div //*[text()登录]/parent::div # 场景5去除空格后匹配文本解决文本含空格的问题 //p[normalize-space(text())用户协议]三、实战注意事项索引规则XPath的索引从1开始而非Python的0开始避免索引错误。属性匹配class属性若有多个值如class“box red”不可用classbox red精准匹配需用contains(class, “box”)。动态元素网页中动态生成的元素如点击后加载的内容需等待元素加载完成Selenium中可用wait方法再使用XPath定位。路径简化优先使用相对路径//避免绝对路径/html/body/…绝对路径易因网页结构变化而失效。多节点获取使用find_elementsSelenium或xpath返回列表lxml获取多个匹配节点避免因节点唯一导致的报错。四、总结XPath的核心是“路径表达式选择器函数”掌握基础语法后可应对绝大多数HTML/XML解析和自动化测试场景。本文梳理了从基础节点结构、路径表达式到常用函数、轴选择器的全部核心知识点结合爬虫、自动化测试的实战案例帮助快速上手。实际使用中需根据网页结构灵活调整XPath表达式优先选择稳定的定位方式如id、唯一属性避免过度依赖文本和动态属性提升定位的稳定性和效率。关注我每天学习一个逆向小知识点从新手成长为逆向高手

更多文章