使用 Selenium 更改 Google 地图评论排序

Change Google Maps review sort with Selenium


我的 **Web Scraping** 用例面临有趣的问题。我需要获取最新的 **Google 地图评论**。
我想按最新日期对评论进行排序。我正在观看的所有教程都是英文的,但在我的母语中 UI 与那些教程中的不同。
我可以使用 **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() 对我不起作用,因为我不能 select 按钮并且在 div 上不起作用。

URL 我正在使用:Link
查看我的 UI 语言更改为立陶宛语。

首先,您必须学习如何创建正确的 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

此代码应该有效。

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

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