【爬虫】5.3 Selenium 查找HTML元素

这篇具有很好参考价值的文章主要介绍了【爬虫】5.3 Selenium 查找HTML元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务目标

  • 在获取了网页的HTML代码后我们可以使用很多方法查找元素并爬取其中的数据
  • Selenium支持XPath、CSS等多种查找元素的方法,掌握这些方法可以灵活地爬取到所要的数据
  • 这个项目我们学习怎么样使用Selenium的XPath、CSS 等方法查找元素数据。

Selenium 提取HTML元素函数/方法
函数/方法 功能描述

find_element_by_xpath(xpath)

find_elements_by_xpath(xpath)

通过xpath定位元素
find_element_by_id(id)    无find_elements_by_id(id) 通过id定位元素
find_element_by_name(value) 通过name定位元素
find_element_by_css_selector(css) 通过css定位元素
find_element_by_tag_name("tag_name_vaule") 通过tag_name定位元素
find_element_by_class_name("class_name") 通过class_name定位元素

find_element_by_link_text("text_vaule")

find_element_by_partial_link_text()

通过link定位元素

通过部分link内容定位元素

WebElement.text

WebElement. get_attribute(attrName)

查找元素的文本

查找元素的属性

注:上面的类似: 

旧版本selenium格式:find_element_by_xpath(xpath) 

新版本selenium格式:find_element(By.XPATH, xpath)


1. 使用XPath查找元素

(1) 函数 find_element_by_xpath(xpath):查找 xpath 匹配的第一个元素,如果找到就返回一个 WebElement 类型的对象,如果找不到就抛出异常

(2) 函数 find_elements_by_xpath(xpath):查找xpath匹配的所有元素组成的列表,每个元素都是一个 WebElement 对象 ,如果找不到就返回空列表

(3) 任何一个 WebElement 对象都可以调用 find_element_by_xpath 与find_elements_by_xpath 函数。

2. 使用id查找元素

函数 driver.find_element_by_id(id) 查找id编号的第一个元素,如果查找到就返回一个 WebElement 对象,如果没有找到就抛出异常

3. 使用name查找元素

(1)函数 find_element_by_name(value):查找 name=value 匹配的第一个元素,如果找到就返回一个 WebElement 类型的对象,如果找不到就抛出异常;

(2)函数find_elements_by_name(value):查找 name=value匹配的所有元素组成的列表,每个 元素都是一个WebElement对象,如果找不到就返回空列表;

4. 使用CSS查找元素

(1)函数 find_element_by_css_selector(css):查找 css 匹配的第一个元素,如果找到就返回一个 WebElement 类型的对象,如果找不到就抛出异常;

(2)函数 find_elements_by_css_selector(css): 查找css匹配的所有元素组成的列表,每个元素都是一个 WebElement 对象,如果找不到就返回空列表;

5. 使用tag name查找元素

函数 find_elements_by_tag_name(tagName):查找 tagName 匹配的所有元素,如果找到就返回一个 WebElement 列表,如果找不到列表为空。

6. 使用class查找元素

(1)函数 find_element_by_class_name(value) 查找第一个class=value的元素,如果找到就返回该元素的 WebElement 对象,如果找不到就抛出异常。

(2)函数find_elements_by_class_name(value) 查找所有class=value元素,如果找到就返 WebElement列表,如果找不到列表为空。

7. 使用文本查找超级链接

(1)函数 find_element_by_link_text(text) 查找第一个文本值为text 的超级链接元素<a>,如果找到就返回该元素的 WebElement 对象 ,如果找不到就抛出异常。

(2)函数find_element_by_partial_link_text(text) 查找第一个文本值包含text的超级链接元素<a>,如果找到就返回该元素的 WebElement 对象,如果找不到就抛出异常。

(3)函数 find_elements_by_link_text(text) 查找所有文本值为text 的超级链接元素<a>,如果找到就返WebElement列表,如果找不 到列表为空。

(4)函数 find_elements_by_partial_link_text(text) 查找所有文本值 包含text的超级链接元素<a>,果找到就返WebElement列表,如 果找不到列表为空。

8. 查找元素的文本与属性

(1) 任何一个 WebElement 对象都可以通过text属性获取它的文本,元素的文本值是它与它 的所有子孙节点的文字的组合,如果没有就返回空字符串。

(2) 任何一个 WebElement 对象都可以通过 get_attribute(attrName) 获取名称为attrName的属性值,如果元素没有 attrName 属性就返回 None。


实例-网页源码-phone.html

<html>
 <head>
  <style>
    .pic {
        display:inline-block;
        width:200px; 
        vertical-align:top;
        margin:10px;
    }
    .info {
        display:inline-block; 
        width:500px;
    }
    .price { 
        margin: 10px;
        color:red; 
    } 
    h3 {
        display:inline-block;
    }
    .pl {
        color:#888;
    }
  </style>
 </head>
 <body>
  <div>
   <div class="pic">
    <img id="image" src="/images/000001.jpg" width="200"/>
   </div>
   <div class="info">   
    <div class="title">
        <h3 id="title" style="display:inline-block">荣耀 9i</h3>
    </div>
    <div class="mark">
        <span class="pl">品牌</span>:
        <span name="mark">华为</span>
    </div>
    <div class="date">
        <span class="pl">生产日期</span>:
        <span name="date">2016-12-01</span>
    </div>
    <div class="price">
        <span class="pl">价格</span>:
        <span name="price">¥1200.00</span>
    </div>
    <div>简介:</div>
    <div class="detail">
        荣耀 9i 4GB+64GB 幻夜黑
        <a href="#">移动联通</a>
        电信 4G 全面屏手机
        <a href="#">双卡双待</a>
    </div>
   </div>
  </div>
</body>
</html>

实例 Test公共部分如下:

import os
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()  # 启动chromedriver

# 获取HTML文件的绝对路径
file_path = os.path.abspath('phone.html')  # 注:这里的phone.html必须和python程序在同一个目录下才可以使用abspath
# print(file_path)  # D:..\案例代码\5_3 Selenium查找HTML元素\phone.html

# 用get打开本地HTML文件
driver.get(f'file:///{file_path}')  # 注:这里必须使用绝对路径,∴ os.path.abspath()

# 查找元素如下⬇:

查找元素如下⬇:

# 1.查找网页元素<h3>
elem = driver.find_element(By.XPATH, "//div[@class='info']//h3")
print(type(elem))  
# 运行结果:
# <class 'selenium.webdriver.remote.webelement.WebElement'>
# 2. 查找网页中元素<h4>
try:
    elem = driver.find_element(By.XPATH, "//div[@class='info']//h4")
    print(type(elem))
except Exception as err:
    print(err)
# 运行结果:
# Message: no such element: Unable to locate element: 
# {"method":"xpath","selector":"//div[@class='info']//h4"}
# 3. 查找网页中第一个<span>元素的文本
print(driver.find_element(By.XPATH, "//div[@class='info']//span").text)
# 运行结果:
# 品牌
# 4. 查找网页中<div class='mark'>中所有<span>元素的文本
elem = driver.find_element(By.XPATH, "//div[@class='mark']")
elems = elem.find_elements(By.XPATH, ".//span")
for elem in elems:
    print(elem.text)
# 运行结果:
# 品牌
# 华为
# 5. 查找网页中手机的品牌
print(driver.find_element(By.XPATH, "//div[@class='info']//span[@name='mark']").text)
# 运行结果:
# 华为
# 6. 查找网页中手机图像<img>的地址
print(driver.find_element(By.XPATH, "//div[@class='pic']//img").get_attribute("src"))
# 运行结果:
# file:///D:/images/000001.jpg
# 7. 查找网页中手机图像<img>的 alt 属性与 xxx 属性
elem = driver.find_element(By.XPATH, "//div[@class='pic']//img").get_attribute("alt")
print(type(elem), len(elem))
elem = driver.find_element(By.XPATH, "//div[@class='pic']//img").get_attribute("xxx")
print(elem)
# 运行结果:
# <class 'str'> 0
# None
# 值得注意的是<img>默认有 alt  属性,只是这个网页中没有设置,
# 因此获取的 alt  属性值是空字符串,但是<img>默认没有 xxx 属性,因此得到 None。
# 8. 查找网页中<div class='mark'>的 HTML 文本
elem = driver.find_element(By.XPATH, "//div[@class='mark']")
print("innerHTML")
print(elem.get_attribute("innerHTML").strip())
print("outerHTML")
print(elem.get_attribute("outerHTML").strip())
# 运行结果:
# innerHTML
# <span class="pl">品牌</span>:
#         <span name="mark">华为</span>
# outerHTML
# <div class="mark">
#         <span class="pl">品牌</span>:
#         <span name="mark">华为</span>
#     </div>
# 9. 查找网页中 id="title"的元素文本
print(driver.find_element(By.ID, "title").text)
# 运行结果:
# 荣耀 9i
# 10. 查找网页中 id="name"的元素
try:
    print(driver.find_element(By.ID, "name"))
except Exception as err:
    print(err)
# 运行结果:
# Message: no such element: Unable to locate element: 
# {"method":"css selector","selector":"[id="name"]"}
# 11. 找网页中手机品牌
print(driver.find_element(By.NAME, "mark").text)
# 运行结果:
# 华为
# 12. 查找网页 name="xxx"的元素
try:
    driver.find_element(By.NAME, "xxx")
except Exception as err:
    print(err)
# 运行结果:
# Message: no such element: Unable to locate element: 
# {"method":"css selector","selector":"[name="xxx"]"}
# 13. 查找网页中手机品牌
print(driver.find_element(By.CSS_SELECTOR, "div[class='info'] span[name='mark']").text)
# 运行结果:
# 华为
# 14. 查找网页中手机图像地址
print(driver.find_element(By.CSS_SELECTOR, "div[class='pic']>img").get_attribute("src"))
# 运行结果:
# file:///D:/images/000001.jpg
# 15. 查找网页中<div class='mark'>下面的所有元素
elems = driver.find_elements(By.CSS_SELECTOR, "div[class='mark'] *")
for elem in elems:
    print(elem.text)
# 运行结果:
# 品牌
# 华为
# 16. 查找网页中手机型号
print(driver.find_element(By.CSS_SELECTOR, "#title").text)
# 或者:
print(driver.find_element(By.CSS_SELECTOR, "[id='title']").text)
# 运行结果:
# 荣耀 9i
# 17. 查找<div class='mark'>元素下面的所有<span>元素
elem = driver.find_element(By.XPATH, "//div[@class='mark']")
elems = elem.find_elements(By.TAG_NAME, "span")
for elem in elems:
    print(elem.text)
# 运行结果:
# 品牌 
# 华为
# 18. 查找网页中手机型号
print(driver.find_element(By.TAG_NAME, "h3").text)
# 运行结果:
# 荣耀 9i
# 19. 查找网页 class="pl"的所有元素
elems = driver.find_elements(By.CLASS_NAME, "pl")
# 或者:
elems = driver.find_elements(By.XPATH, "//*[@class='pl']")
# 或者:
elems = driver.find_elements(By.CSS_SELECTOR, "*[class='pl']")
for elem in elems:
    print(elem.text)
# 运行结果:
# 品牌
# 生产日期
# 价格
# 20. 查找网页<a href="#">移动联通<a>元素
print(driver.find_element(By.XPATH, "//div[@class='detail']/a").text)
print(driver.find_element(By.LINK_TEXT, "移动联通").text)
print(driver.find_element(By.PARTIAL_LINK_TEXT, "移动").text)
print(driver.find_element(By.PARTIAL_LINK_TEXT, "动联").text)
# 运行结果:
# 移动联通
# 移动联通
# 移动联通
# 移动联通

# print(driver.find_element(By.LINK_TEXT, "移动").text)
# 找不到的,因为这个函数要求文本要完全匹配。

 下一篇文章:5.4 Selenium 实现用户登录文章来源地址https://www.toymoban.com/news/detail-688003.html

到了这里,关于【爬虫】5.3 Selenium 查找HTML元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium查找svg元素

    目录 如何为SVG元素编写XPath 使用local-name()的语法 需要记住的一点

    2024年02月16日
    浏览(46)
  • Python+Selenium实现列表元素的查找定位及删除操作

    获取列表(单页)全部数据 删除某行元素 查找并删除元素(目前仅支持删除单条数据,循环删除待继续研究) 结果示例

    2024年02月13日
    浏览(64)
  • Selenium库快速查找网页元素及执行浏览器模拟操作

    Selenium 是一个自动化测试工具,主要用于模拟用户在网页上的行为,进行自动化测试。 它支持多种浏览器,并且可以在多种操作系统上运行。以下是 Selenium 库的一些主要特点和用途: 网页自动化测试: Selenium 可以模拟用户在网页上的各种操作,如点击、输入文本、选择下拉

    2024年04月23日
    浏览(51)
  • Python爬虫——selenium_元素定位

    元素定位:自动化要做的就是模拟鼠标和键盘来操作这些元素,点击,输入等等。操作这些元素前首先要找到它们,WebDriver提供很多定位元素的方法 根据id来找到对象【常用】 根据标签属性的属性值来获取对象 根据xpath语句来获取对象【常用】 find_elements_by_xpath可以返回多个

    2024年02月13日
    浏览(46)
  • Python爬虫——selenium_访问元素信息

    获取元素属性 获取标签名 获取元素文本

    2024年02月13日
    浏览(36)
  • 03-selenium-获取元素信息

    1、text 获取元素的文本 2、size 获取元素的大小 3、get_attribute 获取元素属性值 4、is_displayed 判断元素是否可见 5、is_enabled 判断元素是否可用 6、is_selected 判断元素是否被选中

    2024年02月11日
    浏览(42)
  • selenium爬虫遇见 display:none元素解决方法

    在爬虫过程中,html页面为了页面简洁美观,某些元素设置了不可见,需要鼠标点击或者悬浮才能展示,导致在爬虫过程中通过XPATH或CSS选择器定位元素时,报错无法找到。 下图是爬取牛客网一些招聘信息时的截屏 定义了一个js变量,然后通过getElementById()或getElementsByClassName

    2024年02月11日
    浏览(36)
  • selenium获取元素信息常用方法

    如何使用 Selenium 获取网页元素的信息 Selenium 是一个用于 Web 应用程序测试的工具,可以使用它来模拟用户在浏览器中的操作,并进行自动化测试。其中最常见的任务之一就是获取网页元素的信息,我们可以使用 Selenium 提供的方法来获取元素的文本内容、大小、属性值等信息

    2024年02月15日
    浏览(45)
  • Python selenium获取元素信息

    视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 主要text属性和三个方法get_attribute(),get_property(),get_dom_attribute() text属性获取元素的文本信息; get_attribute(),get_property(),get_dom_attribute()三个方法都是获取元素的属性值 区别是property是DOM中的属性,

    2024年02月06日
    浏览(46)
  • selenium元素定位,获取某个元素下的所有元素

    例: 想要获取所有的li元素: 结果如下 获取到元素后可以直接进行操作: list_tab[2].click() list_tab[5].send_keys(‘123456’)

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包