【一】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