python - 在python中使用selenium进行网页抓取,点击按钮时遇到麻烦
问题描述
我正在从 Wayfair 抓取客户评论(例如https://www.wayfair.com/appliances/pdp/bissell-aeroswift-compact-bagless-vacuum-bse10083.html)。但是,第一页上只列出了 3 条评论,我需要使用 Selenium 不断“单击”按钮“显示 10 条评论”。
按钮对应的html为:<button data-hb-id="pl_button" class="Button Button--alternate Button--large Button--plainText" type="button"><span class="Button-content"><span><span class="pl-LoadingButton-content is-entered" style="transition: opacity 500ms ease-in-out 0s;"><div class="pl-Box--display-flex" data-hb-id="pl-box">Show 10 More<span class="SeeMoreReviewsButton-reviewsText"> Reviews</span><svg focusable="false" viewBox="0 0 28 28" class="pl-BaseIcon pl-BaseIcon--scalable" aria-hidden="true" data-hb-id="pl-icon"><path d="M14 19a.47.47 0 01-.35-.15l-7-7a.49.49 0 01.7-.7L14 17.79l6.65-6.64a.49.49 0 11.7.7l-7 7A.47.47 0 0114 19z"></path></svg></div></span></span></span></button>
我已经通过使用 find_element_by_xPath 进行了尝试,但 xPath 在几次单击后保持更改:
element = browser.find_element_by_xpath('//*[@id="bd"]/div[2]/div[2]/div[1]/div/div/div/div/div/div[5]/div/div/button')
element.click()
变体 xPath 包括:
//*[@id="bd"]/div[2]/div[2]/div[1]/div/div/div/div/div/div[5]/div/div/button
//*[@id="bd"]/div[2]/div[2]/div[1]/div/div/div/div/div/div[5]/div[1]/div/button
//*[@id="bd"]/div[2]/div[2]/div[1]/div/div/div/div/div/div[4]/div/div/button
另一种查找元素的方法,例如按类和 css 选择器也不能很好地工作。
有谁知道我应该如何获取按钮元素并单击它?
非常感谢!
解决方案
这是一个连续单击该元素的示例。
url = "https://www.wayfair.com/appliances/pdp/bissell-aeroswift-compact-bagless-vacuum-bse10083.html"
driver.get(url)
wait = WebDriverWait(driver,10)
while True:
try:
wait.until(EC.element_to_be_clickable((By.XPATH,"//*[text()='Show 10 More']/ancestor::button" ))).click()
except Exception as e:
print(e)
break
您经常需要检查是否可以单击按钮,然后在出现错误时断开循环。Webdriver 等待允许您等到元素可点击,它还会轮询 dom 以使元素也在那里。
进口
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
推荐阅读
- java - 如何在 TextView 中显示左引号(底部对齐)?
- javascript - 当组件安装在 React 中时如何刷新照片链接引用?
- mysql - MySQL 变量数据库名称语法错误
- django - 在 Django 应用程序的服务器上使用 Redis 设置 Celery
- opencv - 使用 OpenCV 在杯子上查找点高度
- django - Django Rest:如何过滤两次嵌套模型序列化器中的数据?
- python - 获取 SQLAlchemy ORM 类的模式名称
- php - 使用复选框在 PhpMyAdmin 中创建记录
- javascript - 如何隐藏网址中的电子邮件?
- c++ - 当我在 CLion 中读取 C++ 数组中的 txt 文件时出现编码问题