首页 > 其他分享 >62.Xpath与Selenium

62.Xpath与Selenium

时间:2024-08-01 10:42:11浏览次数:9  
标签:Xpath xpath 标签 Selenium li 62 html body 节点

【一】xpath

1)介绍

(XML Path Language) 一种小型的查询语言

2)优点

  • 可在XML中查询
  • 支持HTML的查询
  • 通过元素和属性进行导航
# 安装
pip install lxml

# 使用
from lxml import etree
# 将源码转化为能被XPath匹配的格式
selector=etree.HTML(源码) 
# 返回为一列表
selector.xpath(表达式)

3)路径表达式

表达式 描述 实例 解析
/ 从根节点选取 /body/div[1] 选取根结点下的body下的第一个div标签
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 //a 选取文档中所有的a标签
./ 当前节点再次进行xpath ./a 选取当前节点下的所有a标签
@ 选取属性 //@calss 选取所有的class属性

4)谓语

  • 用来查询某个特定的节点包含某个指定的值的节点
  • 谓语被嵌在括号中
路径表达式 结果
/ul/li[1] 选取属于 ul子元素的第一个 li元素。
/ul/li[last()] 选取属于 ul子元素的最后一个 li元素。
/ul/li[last()-1] 选取属于 ul子元素的倒数第二个 li元素。
//ul/li[position()❤️] 选取最前面的两个属于 ul元素的子元素的 li元素。
//a[@title] 选取所有拥有名为 title的属性的 a元素。
//a[@title='xx'] 选取所有 a元素,且这些元素拥有值为 xx的 title属性。
//a[@title>10] > < >= <= != 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
/body/div[@price>35.00] 选取body下price元素值大于35的div节点

5)选取位置节点

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

6)选取若干路径

  • 通过在路径表达式中使用 | 运算符,可用选取若干个路径

7)示例

from lxml import etree
doc = '''
<html>
 <head>
  <base href='http://example.com/' />  <!-- 设置基准链接 -->
  <title>Example website</title>  <!-- 设置网页标题 -->
 </head>
 <body>
  <div id='images'>
   <a href='image1' id='lqz'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''

# 将HTML字符串转为可解析的对象
html = etree.HTML(doc)

# 1. 获取所有节点
all_nodes = html.xpath('//*')

# 2. 指定节点(结果为列表)
head_node = html.xpath('//head')

# 3. 子节点和子孙节点
# 获取div下的所有a标签
child_nodes = html.xpath('//div/a')  
# 获取body下的所有子孙a标签
descendant_nodes = html.xpath('//body//a')  

# 4. 父节点
# 获取第一个a标签的父节点
parent_node = html.xpath('//body//a[1]/..')  

# 5. 属性匹配
# 获取href属性为"image1.html"的a标签
matched_nodes = html.xpath('//body//a[@href="image1"]')  


# 6. 文本获取
# 获取第一个a标签的文本内容
text = html.xpath('//body//a[@href="image1"]/text()')  

# 7. 属性获取
# 获取所有a标签的href属性值
href_attributes = html.xpath('//body//a/@href')  

# 8. 属性多值匹配
# 获取class属性包含"li"的a标签
li_class_nodes = html.xpath('//body//a[contains(@class, "li")]')  

# 9. 多属性匹配
# 获取class属性包含"li"和name属性为"items"的a标签
matched_nodes = html.xpath('//body//a[contains(@class, "li") and @name="items"]')  

# 10. 按序选择
# 获取第二个a标签的文本内容
second_a_text = html.xpath('//a[2]/text()')  

# 11. 节点轴选择# 获取a标签的所有祖先节点
ancestors = html.xpath('//a/ancestor::*')  
# 获取a标签的祖先节点中的div
div_ancestor_node = html.xpath('//a/ancestor::div')  
# 获取第一个a标签的所有属性值
attribute_values = html.xpath('//a[1]/attribute::*')  
# 获取第一个a标签的所有子节点
child_nodes = html.xpath('//a[1]/child::*')  
# 获取第六个a标签的所有子孙节点
descendant_nodes = html.xpath('//a[6]/descendant::*')  
# 获取第一个a标签之后的所有节点
following_nodes = html.xpath('//a[1]/following::*')  
# 获取第一个a标签之后的同级节点
following_sibling_nodes = html.xpath('//a[1]/following-sibling::*')  

【二】Selenium框架

1)安装

pip install selenium

驱动网站:Chrome 测试版的可用性 (googlechromelabs.github.io)

2)简单使用

  • 将下载的驱动(chromedriver.exe)放入到python安装目录下的Scripts文件夹中
# 【三】验证安装
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
import time

# 创建一个 service 对象 Service(executable_path="驱动的地址")
service = Service(executable_path="./chromedriver.exe")
# 生成浏览器对象
browser = Chrome(service=service)
# 控制浏览器打开百度
browser.get('https://www.baidu.com')
# 睡一会
time.sleep(3)

3)示例

from selenium import webdriver
# 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.by import By
# 键盘按键操作
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
# 等待页面加载某些元素
from selenium.webdriver.support.wait import WebDriverWait

# 将驱动加到环境变量中,自动检索驱动位置
chrome = webdriver.Chrome()

try:
    # 自动打开浏览器,请求目标网址
    chrome.get('https://www.jd.com')
    # 找到搜索框对应的标签
    input_tag = chrome.find_element(value="key")
    # 自动传入关键字
    input_tag.send_keys('hellokitty')
    # 自动回车(搜索)
    # 也可以找到搜索标签 btn.click
    input_tag.send_keys(Keys.ENTER)
    wait = WebDriverWait(chrome, 10)
    # time.sleep(3)
    # 等到id为J_goodsList的元素加载完毕,最多等10秒
    wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
    chrome.save_screenshot("hellokitty.png")
finally:
    # 关闭浏览器页面
    chrome.close()

标签:Xpath,xpath,标签,Selenium,li,62,html,body,节点
From: https://www.cnblogs.com/Mist-/p/18336144

相关文章

  • ISO26262 Part 3 之 Occurrence与Frequency的区别
    针对风险R,可以描述为一个包含三个参数的函数F:危害事件发生频率f,可控性C,以及所产生伤害或损坏的潜在严重度S:R=F(f,C,S)其中f受两个因素影响:一个因素是以何种频率、多长时间暴露在危害事件的运行场景中;简化成运行场景发生概率的度量E另外一个因素是相关项中故障......
  • ISO26262 Part 2 之 不同层级的影响分析
    1.目的在安全生命周期开始时,应进行相关项层面的影响分析,以确定相关项是全新开发,或是对现有相关项修改,还是对现有相关项的使用环境进行修改。而,如果涉及到对现有要素的复用,则需要进行要素层面的影响分析;2.相关项层面的影响分析2.1Case1如果是全新开发,则需要按照......
  • Python Selenium 单击 webdriverwait 与 find_element
    我无法理解这两个代码块之间的区别。发送点击在webdriverwait和find_elements中都有效。代码1fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.suppo......
  • Selenium“没有提供‘moz:firefoxOptions.binary’功能,并且在命令行上没有设置二进制
    我一直在尝试将python脚本移植到我的wsl/bash编码中心中。我继续收到此错误:Traceback(mostrecentcalllast):File"/path/to/my/file.py",line20,in<module>driver=webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))Fil......
  • 使用 Selenium 导出链接时出现 NoSuchDriverException 错误
    我想设置一个脚本来从输入URL后生成的网站导出链接。相关网站是pagespeed.web.dev。我的知识为零,所以虽然我知道这不是最好的选择,但我还是向ChatGPT寻求帮助。看起来只用1个URL就可以很好地完成所有事情,但一旦我尝试做5个URL,它就崩溃了。注意:据我了解,我不是数据抓取,......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 全新小体积RK3562核心板,解锁神秘技能!
    RK3562小体积金手指系列核心板基于瑞芯微四核Cortex-A53+Cortex-M0处理器设计,工作主频高达2GHz,最高搭载4GB高速LPDDR4、32GB eMMC。该核心板拥有204 Pin脚,尺寸仅为67.6mm *45mm,支持千兆网、USB3.0、串口、PCIE、HDMI等丰富外设资源,非常适合于高性能、高性价比的工业应用场景。......
  • Python:使用 Selenium WebDriver 无法在客户端打开浏览器
    我使用SeleniumWebDriver开发了一个应用程序来打开一些页面。它在本地工作得很好,但我还需要在客户端启动浏览器。我使用Apache2underUbuntu18部署了应用程序。driver=webdriver.Chrome(executable_path="chromedriver",chrome_options=ch......
  • 【Python】从0开始写脚本、Selenium详细教程、附源码案例(保姆篇)
    文章目录准备工作安装selenium配置浏览器驱动脚本测试什么是Selenium?Selenium功能示例(可直接拷贝执行)编写一个简单的Python脚本来使用Selenium打开一个网页,并获取网页的标题下面是一个示例,自动打开csdn并进行搜索Selenium使用Selenium元素定位文本输入、清除与提交......
  • 怎么解决pytnon爬虫遇到需滚动才能获取数据(selenium)
    需要滑轮滚动才能显示元素获取数据当你遇到网页数据需要滚动到底部或滚动到某个位置才能加载出来时,这通常是因为网页采用了懒加载(LazyLoading)技术来优化页面加载速度和性能。在这种情况下,使用Python爬虫时,你需要模拟滚动行为以触发数据的加载。这可以通过几种方式实现,包括使......