XPath和Selenium的使用

XPath 是一门在 XML 文档中查找信息的语言

/:  ——># 从根节点选取:

//: ——># 不管位置,直接找

/@属性名     ——># 获取对应属性值

/text()     ——># 获取文本内容

使用方式:

from lxml import etree

html = etree.HTML(html_doc)     # html_doc 指的是HTML文档内容

1.所有节点
html.xpath('//*')

2.指定节点
html.xpath('//head')

3.子节点,子孙节点
html.xpath('//body/a')
html.xpath('//body//a')

4.父节点
html.xpath('//body//a[@href="image.html"]/..')

5.属性匹配
html.xpath('//body//a[@href="image.html"]')

6.文本获取
html.xpath('//body//a[@href="image.html"]/text()')

7.获取属性
html.xpath('//body//a/@href')

8.属性多值匹配
html.xpath('//body//a[contains(@class,"li")]/text()')

9.多属性匹配
html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')

10.按序匹配(从1开始)
html.xpath('//a[2]/text()')

Selenium 是为了解决 requests 无法直接执行 JavaScript 代码的问题。

本质是通过驱动浏览器,完全模拟浏览器的操作,输入、点击、下拉等。

安装: pip install selenium

并且驱动要跟浏览器版本对应

简单使用模拟百度搜索:

import time

from selenium import webdriver

bro = webdriver.Chrome(executable_path='./chromedriver.exe')  # 得到一个谷歌浏览器对象,并指定使用那个驱动

bro.implicitly_wait(5)  # 隐士等待:找一个控件,如果控件没有加载出来,就等待5S,只需要写着一句,以后所有控件都按照这个操作来

bro.get('https://www.baidu.com')  # 在地址栏里输入百度

input_k = bro.find_element_by_id('kw')  # 找到百度输入框对应的控件

input_k.send_keys('python')  # 框里面输入python

sou = bro.find_element_by_id('su')  # 找到搜索按钮

sou.click()  # 点击搜索按钮

time.sleep(3)

bro.close()  # 关闭浏览器

find选择器

Selenium 中有内置的选择器对 html 文件内容进行选择处理

选择方法:

1、find_element_by_id            # 通过id查找控件
2、find_element_by_link_text     # 通过a标签内容找
3、find_element_by_partial_link_text     # 通过a标签内容找,模糊匹配
4、find_element_by_tag_name      # 标签名
5、find_element_by_class_name    # 类名
6、find_element_by_name          # name属性
7、find_element_by_css_selector  # 通过css选择器
8、find_element_by_xpath         # 通过xpaht选择器

注意:
find_elements_by_xxx 的形式是查找到多个元素,结果为列表

使用方法示例:

from selenium import webdriver

bro = webdriver.Chrome(executable_path='./chromedriver.exe')

bro.implicitly_wait(5)

bro.get('https://www.cnblogs.com/XiaoYang-sir/p/15077518.html')

tag = bro.find_element_by_id('_label1')  # 找到id=_label1的标签
print(tag.text)  # 获取文本内容

bro.close()

其他操作:

tag.get_attribute('href')  # 找当前控件 的href属性对的值
tag.text        # 获取文本内容

tag.id          # 当前控件id号
tag.location    # 当前控件在页面位置
tag.tag_name    # 标签名
tag.size        # 标签的大小

bro.delete_all_cookies()    # 获取cookie

元素交互

tag.send_keys()  # 往里面写内容
tag.click()      # 点击控件
tag.clear()      # 清空控件内容

执行 JS 代码

bro.execute_script('window.open()') # 打开浏览器后执行js代码

无界面浏览器

谷歌浏览器支持不打开页面进行操作

from selenium.webdriver.chrome.options import Options
from selenium import webdriver

chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000')  # 指定浏览器分辨率
chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

bro = webdriver.Chrome(chrome_options=chrome_options,executable_path='./chromedriver.exe')

bro.get('https://www.baidu.com/')
print(bro.page_source)
bro.close()

Original: https://www.cnblogs.com/XiaoYang-sir/p/15173174.html
Author: Mr-Yang`
Title: XPath和Selenium的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591842/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 定时调度的线程池

    定时调度线程池 当我们需要定时进行线程的调度 @Slf4j public class Test5 { public static void main(String[] args) …

    数据库 2023年6月11日
    084
  • 23种设计模式之责任链模式

    文章目录 概览 责任链模式的优缺点 责任链模式的结构和实现 * 模式的结构 模式的实现 总结 ; 概览 责任链模式(Chain of Responsibility Pattern)…

    数据库 2023年6月6日
    0104
  • pytest中pytest_cache文件夹作用

    跑自动化时经常会出现这样一个情况,一轮自动化跑完后零星出现了几个失败case,无法断定失败的原因,所以需要重新跑一下失败的case去debug,那我们要做的是就去修改脚本把那几个c…

    数据库 2023年6月11日
    062
  • MySQL 视图简介

    对数据库中数据的查询有时是非常复杂的,如表连接、子查询等。这种查询很难写,而且容易出错。此外,当您专门操作表时,有时只需要操作部分字段。 [En] The query about …

    数据库 2023年5月24日
    0112
  • mysql练习题emp,dept

    DROP DATABASE IF EXISTS emp; CREATE DATABASE emp; USE emp;  CREATE TABLE dept( &a…

    数据库 2023年6月9日
    0185
  • leetcode 437. Path Sum III 路径总和 III(中等)

    一、题目大意 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也…

    数据库 2023年6月16日
    0102
  • dubbo 使用Multicast注册中心找不到Provider (No provider available for the service)

    使用Multicast注册中心配置,缺省配置为通过Multicast注册中心广播互相发现。所以在同一台机器时需设置unicast=false:即:multicast://224.5…

    数据库 2023年6月16日
    094
  • 分享一例同一系统里不同服务之间通信的设计方案

    优付系统结构如下。一个数据库之上,有商户接口(RestAPI)、运营后台(OMS)、商户门户这3个独立SSM应用,三者有各自不同的功能处理逻辑。 现在呢,要做一个补偿工具。当付款单…

    数据库 2023年6月9日
    0140
  • MySQL存储引擎

    一、MySQL体系结构 1. 连接层 顶层是多个客户端和链路服务,主要完成一些类似的连接处理、授权认证、以及相关的安全解决方案。该服务器还将为每个客户提供安全保护 [En] The…

    数据库 2023年5月24日
    079
  • NO.1 通讯录管理系统+源代码(C++)

    功能描述:显示简单的菜单,供用户选择操作 实现步骤:直接cout输出 功能描述:根据用户不同的操作代码选择,进入不同的功能,我们使用switch分支结构进行搭建 实现步骤:用whi…

    数据库 2023年6月14日
    076
  • 在centos环境下编译安装myrocksdb

    rocksdb(https://rocksdb.org.cn/)是脸书(facebook)公司开源的一个key-value存储引擎,基于leveldb开发。rocksdb使用的是L…

    数据库 2023年6月14日
    099
  • Zabbix自带模板监控MySQL服务

    Zabbix的服务端与客户端的安装这里不再赘述了,前面也有相应的文章介绍过了,感兴趣的伙伴们可以看看历史文章就可以了,今天主要介绍下如何利用zabbix自带的模板来监控MySQL服…

    数据库 2023年6月9日
    0116
  • Azkaban快速入门

    因为之前自己工作中有用过Azkaban作为自动化任务调度工具,所以想参考自己之前的使用经验,总结一下关于Azkaban的使用,方便大家使用Azkaban快速实现企业级自动化任务 如…

    数据库 2023年6月11日
    098
  • 这个Python读取文件的方法,堪称天花板级别…

    序言 哈喽兄弟们,今天咱们来了解一下 fileinput 。 说到fileinput,可能90%的码农表示没用过,甚至没有听说过。 这不奇怪,因为在python界,既然open可以…

    数据库 2023年6月14日
    083
  • JAVA oa 办公系统模块 设计方案

    1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 、自由跳转 3….

    数据库 2023年6月6日
    089
  • 16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

    不对,如果两个对象x和y满足x.equals(y) == true,那么他们的哈希码应该相同。 根据hashCode方法协定:在每个重写了equals方法的类中,必须重写hashC…

    数据库 2023年6月6日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球