一、find_elements()的作用

1.获取当前页面中所有酒店名称的元素

通过元素的class属性获取酒店名,获取到了20个

这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。

这20个酒店名称都有同一个爸爸div

1)find_element(By.XPATH,)

find_element的意思是查找一个元素。 //span[@class=“name”]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。

find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。

页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。

2)find_elements(By.XPATH,)

要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。

find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。

Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。

2.获取当前页面中所有酒店价格的元素

这个表达式匹配到20个元素

3.获取当前页面中所有酒店评分的元素

这个表达式匹配到20个元素

二、分别拿到每家的价格、评分、酒店名并写入文件

这20个元素,每个这样的元素里面都有价格、评分、酒店名称。

1.分别拿到每家的价格、评分、酒店名

这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。

这个换行的效果是print()搞定的

2.将拿到的数据写入文件

fs = open(“我的酒店数据.txt”, “w”,encoding=‘UTF-8’) UTF-8支持中英文。

读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。

w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。

w 这种模式写的时候是直接覆盖文件中的内容的。

三、代码

from selenium.webdriver.common.by import Byfrom selenium import webdriver
import time# 打开谷歌浏览器,与浏览器建立了会话。
# driver变量=会话。
driver = webdriver.Chrome()
driver.get("https://www.elong.com/")  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。
# get()这个功能是会等到页面加载完成的。
# 有的时候页面加载出来了,但是渲染的方式有些慢。
# 所以我还想等1秒也是可以的。
time.sleep(1)# 查找元素通过xpath定位方式。
ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。
# ele= 我找到的元素
# 点击操作 -- 点击目的地输入框,弹出城市选择框。
ele.click()
time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。
# 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。
# 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。# 输入操作 --ele.send_keys("输入操作")
# 获取它的属性-- ele.get_attribute("属性名称")
# 获取它的文本内容-- ele.text# 选择热门城市当中的广州
driver.find_element(By.XPATH, '//li[@data="0|15"]').click()
time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。
# 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。# 选择入住日期
ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')
ele.clear()  # 输入日期前,先清空输入框的内容。
ele.send_keys("2022-05-27")time.sleep(1)  # 每个操作间都加了等待时间。'''
输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素
(选一个页面固定的元素,那就点击目的地这个元素),
日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。
接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。
所以我是根据页面的特征习性来处理的。
'''# 把弹出的日期选择框关掉。
driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()# 选择退房日期
b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')
b.clear()
b.send_keys("2022-05-30")  # 输入日期
time.sleep(1)
driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()
time.sleep(1)# a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')
# a.clear()
# a.send_keys("喜悦门酒店(广州融创文旅城店)")
# time.sleep(1)
# driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()# ========2、点击搜索按钮=========
# time.sleep(0.5)
driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()# ==========3、跳转到新的页面了,等待新的页面内容加载=========
time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。# ================4、获取酒店的名字、酒店的价格、酒店的评价===============
# 拿到第一家酒店的信息
# hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text
# hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text
# hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text
# print("酒店信息:",hotel_name,hotel_review,hotel_price)# ======================5、获取当前页面的所有酒店的价格、评分、名字
# find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。
# 所有酒店的名称元素
total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。
time.sleep(1)# python中用来存放多个数据的是:list/字典/元组/集合这几种方式。# 所有酒店的价格元素
total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')
time.sleep(1)
# 所有酒店的评分元素
total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')# 从3个列表当中,每个值都要取出来。
# 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。
# 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。
# 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。
'''
for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。取到的每一个成员,会去做的事情。取到的每个酒店,都要去拿酒店的名字、价格和评分。遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
'''# 文件操作 -- 我的酒店数据.txt
# 读写操作。创建一个文件,写入数据,然后关闭。
# open -- 文件操作。
# 打开文件的时候,指明写入方式,以及编码格式为utf-8
fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。
# 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。
#w 这种模式是直接覆盖文件中的内容的。
# write写的时候,不会自动换行。  换行:\n# for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:
for index in range(20):print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。fs.write(total_prices[index].text + "  ")# fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值# fs.write(total_prices[index].get_attribute('class') + "    ")fs.write(total_previews[index].text + "\n")# 关闭文件
fs.close()# for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。
time.sleep(10)#########6.更多的事情:先选价格,再去看评分。###################
jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()
try:pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')for score in range(20):print(pingfens[score].text)fn.write(pingfens[score].text+ "\n")fn.close()
except:pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')for score in range(20):print(pingfens[score].text)fn.write(pingfens[score].text+ "\n")fn.close()
#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。# ========7、关闭浏览器,关闭本次会话========
time.sleep(10)
driver.quit()  # 退出相关驱动,关闭所有窗口。

运行成功

四、总结与扩展

1.总结

1.find_elements()用来查找所有的元素,而且它的结果是个列表。

2.列表的处理方式 – 遍历取值,创建文件。

3.遍历列表 – for循环。

4.数据写入文件。

2.扩展

根据列表的长度去遍历:再掌握range函数的用法。参考链接:操作列表

运行这个fs.write(total_prices[index].get_attribute(“属性名称”)+" ")#获取属性值

和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。

第一种方式的运行结果

第二种方式的运行结果

以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。

爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。

Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇相关推荐

  1. Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇...

    目录 一.find_elements()的作用 1.获取当前页面中所有酒店名称的元素 2.获取当前页面中所有酒店价格的元素 3.获取当前页面中所有酒店评分的元素 二.分别拿到每家的价格.评分.酒店名并 ...

  2. 获取文本上字符出现的次数,把数据写入文件

    /*** @author 影子* @create 2021-12-19-11:49** * 练习3:获取文本上字符出现的次数,把数据写入文件* ** * 思路:* * 1.遍历文本每一个字符* * 2 ...

  3. web网页设计与开发:旅游酒店网站设计——红色大气的度假酒店预订网站html模板(5页) HTML+CSS+JavaScript

    HTML5期末大作业:旅游酒店网站设计--红色大气的度假酒店预订网站html模板(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页 ...

  4. HTML5期末大作业:旅游酒店网站设计——旅游酒店服务预订(1页) web网页设计—— 出游

    HTML5期末大作业:旅游酒店网站设计--旅游酒店服务预订(1页) web网页设计-- 出游 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒 ...

  5. HTML+CSS大作业HTML5期末大作业 旅游酒店网站设计——旅游酒店服务预订(1页) web网页设计—— 出游

    HTML5期末大作业:旅游酒店网站设计--旅游酒店服务预订(1页) web网页设计-- 出游 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒 ...

  6. SketchUp的自动化实战 (二)获取内部空间

    SketchUp的自动化实战 (二)获取内部空间 之前在做光伏插件的时候用到了投影功能, 投影功能有很多应用场景, 今天我们来制作一个获取柜体 内部空间 的插件. 获取柜体内部空间 ▼ (获取内部抠门 ...

  7. Web网页调用本地摄像头、实时获取图片

    PC端Web网页跳用本地摄像头,实时获取图片.(注意事项:如果是本地localhost可直接调用,挂到服务器必须使用https访问) 仅测试了google浏览器,运行代码,会跳出摄像头授权,请按&qu ...

  8. python 获取网页表格数据_python实战4获取tushare数据

    python 4 实战4 获取Tushare数据 阅读之前请注意: 代码都为红色.由于公众号宽度不够,没有特别注明,即使换行都是同一句代码,中间没有换行符.如果是两行代码,会用空行隔开. SQL语句请 ...

  9. 【实战】物联网安防监控项目【5】———把模拟数据传输到web网页、web显示mjpeg-streamer视频图像

    1.模拟数据传输到web 为了把硬件传感器上的数据上传到web网页,我们需要在跑linux服务器的开发板上写一个应用程序,并创建出几个线程来收集传感器检测到的数据,通过进程/线程间通信.boa与cgi ...

最新文章

  1. torch.nn.module API
  2. 电脑总是跳出错误报告
  3. Java访问修饰符public,private,protected,以及不写(默认)时的区别?
  4. css 元素 property value计算过程的学习笔记
  5. c语言编程代码对父母感恩,c语言中编程:每个做父母的都关心自己孩子成人后孩子的生高:...
  6. matplotlib设置多个图例横向水平放置
  7. 异常和中断处理流程: Exception- or Interrupt-Handler Procedures
  8. 如何将松散的dll打包进需要发布的exe
  9. LINUX下载编译libfaac
  10. linux系统查看内核版本是多少,在linux下查看内核版本、gcc版本、操作系统多少位等参数...
  11. 学校oj显示在线用户数超过了序列号允许。您需要购买或升级您的序列号
  12. html颜色代码错误,HTML颜色代码表
  13. gis等高线注记掩膜
  14. 解决Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these...问题
  15. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
  16. 10.2.0.1到12.2.0.1数据库迁移expdp+dblink导入失败
  17. 前端学习笔记——node.js
  18. java socat_linux – socat两个串口一起
  19. 地理大圆距离 C语言,通过经纬度计算两点之间的距离
  20. FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种

热门文章

  1. 九九乘法表|99除法表|99除法表|11乘除法|12乘除法
  2. VS 17、19、22程序打包Installer Projects
  3. LOL技能设计的10个原则
  4. 架构师学习--动态换肤
  5. 关于assert断言的使用
  6. 超链接有哪几种 制作表格时WPS怎么在表格中插入超链接
  7. Excel中mid函数的用法
  8. Java 将知乎问题下所有的回答保存到本地
  9. 资深老师教你几个PS中快速选中对象方法
  10. 基于MySQL的留言回复功能(SSM框架实现)