前言
我们知道,不管是爬虫还是自动化测试,元素定位是最基本而且必须的一个步骤。今天我们就来讲讲怎么定位元素。
爬虫中定位元素
爬虫中怎么定位元素呢?常见的有以下几种:
- BeautifulSoup find 定位
- BeautifulSoup css 定位
BeautifulSoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,我们需要安装并导入这个库。
from bs4 import BeautifulSoup
我们再把我们提取的 html 数据转换成 lxml 格式,方便 BeautifulSoup 库直接提取信息。
import requests
html = requests.get('ttps://www.pyzhishiquan.com/crawler')
soup = BeautifulSoup(html, "lxml")
BeautifulSoup find查找元素
接下来我们就可以用 find 方法来查找元素了,比如查看所有 a 标签元素。
soup.find_all('a')
BeautifulSoup css 选择器定位元素
BeautifulSoup 中我们也可以通过 css 选择器查找定位元素,导包和格式转换和上面一样,格式如下。
soup.select('xxx')
select 方法中的字符串参数怎么获取呢,以 Chrome 浏览器为例,F12 检查元素中右键复制 seletor 就可以了。
当然,在源代码中无法获取的元素的 Ajax 动态加载的页面,上面的定位方法就不管用了,我们可以通过分析 Network 中的请求,找到你需要提取的信息的规律,这个内容本文不做讲解。还有一种方法是通过 selenium 库来解决,selenium 库是模拟人工操作浏览器的,优点可见即可爬,就是只要他能看到的都能获取信息爬取下来。
selenium 定位
selenium 库定位元素有方法很多,今天分享下常见的的定位方法。
我们首先需要导入 selenium 库,通过 webdriver 启动 Chrome 浏览器。
from selenium import webdriver
driver = webdriver.Chrome()
ID 定位
ID 一般在页面元素中是唯一的,可以准确定位页面元素。
driver.find_element_by_id('id')
有些页面元素的 id 是每次刷新页面都不一样的,比如 163 邮箱的用户名输入框 id,每次刷新页面,这个 id 都会变。所以,对于这种每次不一样的 id,我们都不能用 id 来定位了。
这种随机 id 的元素我们就通过其他属性来定位或者通过父元素来找到子元素。
classname 定位
如果 classname 是唯一的话,我们就可以通过 classname 来定位元素。
driver.find_element_by_id('classname')
Xpath 定位
Xpath 路径获取方法第一个方法和刚才获取 selector 信息一样,直接 copy。
第二个方法可以借助插件,Chrome 浏览器上的 Xpath Helper 插件和火狐插件 firepath,以 Xpath Helper 为例,打开后按住 Shift 键,移动到想定位的元素,左边就会显示 Xpath 路径。
这种方法缺点也很明显,XPath 都是从根路径开始的,导致 XPath 过长,不利于维护。
双属性定位
对于一个属性不是唯一的,我们可以用 Xpath 的双属性来定位元素,这个方法对于定位网页和 APP 都适用。
上图是网易云 APP,我想定位签到按钮,我可以通过 class 属性和 text 属性同时定位元素。
driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @text="签到"]')
这种方法适用于很多元素共用同一个属性的情况,经过我们的组合,就把元素唯一化了。
网页元素同样也可以用双元素来定位,方法是一样的。
以上是 pk 哥平时常用的定位元素的方法,如有其他好的定位方法,欢迎大家留言讨论,共同进步。