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)

大家都在看

  • day40-网络编程02

    Java网络编程02 4.TCP网络通信编程 基本介绍 基于客户端–服务端的网络通信 底层使用的是TCP/IP协议 应用场景举例:客户端发送数据,服务端接收并显示控制台…

    数据库 2023年6月11日
    069
  • SpringMvc(四)- 下载,上传,拦截器

    1、图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载; 1.1 图片下载步骤 1.通过session获取上下文对象(session.getS…

    数据库 2023年6月16日
    054
  • 【数据库】– MySQL中比like更高效的三个写法

    一般在项目中我们进行模糊查询常见使用like ‘%findStr%’进行,但是在字段中进行模糊匹配及contains类查询还有下面三种写法: SELECT …

    数据库 2023年6月6日
    084
  • 什么是前缀索引?

    一、什么是前缀索引? 所谓前缀索引,说白了就是对文本的前几个字符建立索引( 具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效…

    数据库 2023年6月14日
    099
  • SpringBoot 整合 MongoDB 实战解说

    在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词: 数据库、集合、文档!…

    数据库 2023年6月14日
    081
  • ODA→Teigha胎压–学习笔记

    数据库结构 记录对象表 对象字典 具有固定类型和固定可访问操作的特定对象的固定结构的固定集合 可以存储和操作各种类型的对象,包括它自己。 每个记录都有一个特定的类类型,每个表也有一…

    数据库 2023年6月14日
    061
  • 【海量数据算法】如何判断一个数是否在40亿个整数中

    如何判断一个数是否在40亿个整数中 2.1《编程珠玑》给出的方案 我们把40亿个数中的每一个用32位的二进制来表示,假设这40亿个数开始放在一个文件中。 然后将这40亿个数分成两类…

    数据库 2023年6月11日
    076
  • 设计模式之简单工厂

    一、简单工厂:为了客户类和服务类之间的解耦,把对象的创建任务交给第三方类,这个第三方类就充当工厂的作用,严格来说简单工厂不属于23种设计模式之一。 二、实现思路 :创建一个简单工厂…

    数据库 2023年6月14日
    075
  • 分享我常用的一些JS验证和函数

    下面是我常用一些JS验证和…

    数据库 2023年6月9日
    076
  • Django中使用QQ登录

    1.返回QQ登录网址的视图 请求方式: GET /oauth/qq/authorization/?next=xxx 请求参数: 查询字符串 参数名 类型 是否必须 说明 next …

    数据库 2023年6月14日
    0102
  • git开发常用命令

    1.基本命令git branch 查看本地分支git branch -r 查看远程分支git checkout xxx 切换分支git pull origin master //从…

    数据库 2023年6月9日
    083
  • 第十六章:接口

    本篇翻译自《Practical Go Lessons》 Chapter 16: Interfaces 1 你将在本章学到什么? 什么是类型接口? 如何定义接口。 “实现…

    数据库 2023年6月6日
    084
  • MyBatis(一)-入门

    ==>>MyBatis中文网 1、第一个 mybastis程序 1.1 导入jar包 3.4.1 5.1.47 org.mybatis mybatis ${mybati…

    数据库 2023年6月16日
    076
  • 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架——MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 在之前的文章中我们学习了MYSQL和JDBC…

    数据库 2023年6月14日
    085
  • 实现一个简单的Database3(译文)

    前文回顾 实现一个简单的Database1(译文) 实现一个简单的Database2(译文) 实现一个简单的Database3(译文) 译注:cstsck在github维护了一个简…

    数据库 2023年6月11日
    082
  • Python:如何只用十几行代码写一个程序?

    Python可以做的事情真的太多了,常见的网站开发,软件开发,爬虫,数据分析,人工智能,机器学习,量化投资,自动化办公,自动化运维,游戏开发,脚本制作,树莓派等等等等~ 今天咱们就…

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