62.Xpath与Selenium

【一】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()
posted on 2024-08-01 10:36  晓雾-Mist  阅读(83)  评论(0)    收藏  举报