繁体   English   中英

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

[英]Change Google Maps review sort with Selenium


我的 **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()对我不起作用,因为我不能 select 按钮并且在 div 上不起作用。

URL 我正在使用: 链接
看到我的用户界面更改为立陶宛语。

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

这段代码应该可以工作。

单击“排序”按钮后,我添加了一个 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()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM