【问题标题】:Change Google Maps review sort with Selenium使用 Selenium 更改 Google 地图评论排序
【发布时间】:2022-01-05 08:16:05
【问题描述】:

我的 **Web Scraping** 用例遇到了有趣的问题。我需要获取最新的 **Google 地图评论**。
我想按最新日期对评论进行排序。我正在观看的所有教程都是英文的,但在我的母语中,用户界面与那些教程不同。
我可以使用 **Selenium** 和按钮的 **XPATH** 单击按钮,但我不知道如何从可见的下拉菜单中更改排序选项。
# Click the sort button
driver.find_element_by_xpath('//*[@id="pane"]/div/div[1]/div/div/div[2]/div[8]/button').click()

select_by_visible_text()select_by_value() 对我不起作用,因为我无法选择按钮并且在 div 上不起作用。

我使用的网址:Link
查看我的 UI 更改为立陶宛语。

【问题讨论】:

  • 请分享您正在处理的页面的确切链接。是公共页面,没问题。
  • 先知,更新了我的问题。

标签: python selenium web-scraping xpath webdriverwait


【解决方案1】:

首先,您必须学习如何创建正确的 XPath 定位器。
长 XPath 表达式太脆弱了。
“排序评论”按钮定位器而不是
//*[@id="pane"]/div/div[1]/div/div/div[2]/div[8]/button 可以是
//button[@aria-label='Sort reviews']
//button[@data-value='Sort']
单击此按钮后,要按最新日期对评论进行排序,您可以单击此元素://li[@data-index='1']
所以基本上这会起作用:

driver.find_element_by_xpath("//li[@data-index='1']").click()

但是由于您需要在单击排序按钮后等待对话框打开,因此您需要利用预期条件等待,如下所示:

wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.XPATH, "//li[@data-index='1']"))).click()

为此,您将需要以下导入:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

  • 对我不起作用,请尝试使用我的母语立陶宛语。 ElementClickInterceptedException:消息:元素点击被拦截。
  • 您是使用wait 还是直接使用driver.find_element_by_xpath("//li[@data-index='1']").click()?您得到的异常不是由语言差异引起的。
  • 你是对的,你的代码在经过一些调整后也能正常工作。谢谢
  • 太好了,我很高兴能帮上忙 :)
【解决方案2】:

这段代码应该可以工作。

单击“排序”按钮后,我添加了一个 webdriverwait 等待直到下拉列表中的所有选项都可见,然后单击“最高评分”。 //li[@role='menuitemradio'])[3] 指的是下拉列表中的第三个元素,即“最高评级”。我尝试使用特定的文本而不依赖元素索引,但不知何故它不起作用。但是下面的代码确实对评论进行了排序。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
driver.get("https://www.google.com/maps/place/Senukai/@54.6832836,25.183965,12z/data=!4m11!1m2!2m1!1svilnius+senukai!3m7!1s0x46dd94055529fabf:0xb1132b0ad981d43b!8m2!3d54.7098368!4d25.2999662!9m1!1b1!15sCg92aWxuaXVzIHNlbnVrYWkiA4gBAVoRIg92aWxuaXVzIHNlbnVrYWmSARhidWlsZGluZ19tYXRlcmlhbHNfc3RvcmU")
print(driver.title)
time.sleep(5)
driver.find_element(By.XPATH, "//button[@data-value='Sort']").click()
WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//li[@role='menuitemradio']")))
driver.find_element(By.XPATH, "(//li[@role='menuitemradio'])[3]").click()
time.sleep(2)
driver.quit()

P.S 我偶尔使用time.sleep 来编写快速代码,但使用WebdriverWait 代替time.sleep 会是一个好习惯

【讨论】:

  • 对我不起作用,请尝试使用我的母语立陶宛语。 ElementClickInterceptedException:消息:元素点击被拦截。
  • 好的,你能在快照中指向元素 DOM 吗?因为当我点击您提供的网址时,它会以英文打开,因为那是我在操作系统中的母语。基本上,我认为您只需要将英文文本更改为立陶宛语。我的意思是,您可以使用 //button[@aria-label='Labiausiai atitinkantys'] 而不是使用 //button[@aria-label='Sort reviews']
  • 该死的,我刚刚想通了。谢谢你。您的代码经过一些调整后工作。谢谢
  • 很高兴知道!阐明您所做的调整,以便将来对其他人有用。谢谢!
猜你喜欢
  • 2012-07-06
  • 2019-04-28
  • 2021-09-16
  • 2023-02-23
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多