为何我的Selenium代码无法通过XPath获取网页文本值?
Selenium通过XPath获取TripAdvisor餐厅名称失败的原因
情况说明
我使用以下Selenium代码可成功通过XPath从TripAdvisor网页中获取餐厅名称并写入CSV文件:
from selenium import webdriver from selenium.webdriver.common.by import By import time with open('restaurants.csv', 'w', encoding='utf-8') as file: file.write('name \n') driver = webdriver.Chrome() driver.get('https://www.tripadvisor.co.nz/Restaurants-g1811027-Auckland_North_Island.html') time.sleep(3) names = driver.find_elements(By.XPATH, "//div[@class='biGQs _P fiohW alXOW NwcxK GzNcM ytVPx UTQMg RnEEZ ngXxk']/a") with open('restaurants.csv', 'a', encoding='utf-8') as file: for name in names: file.write(name.text + '\n') file.close driver.quit()
但我编写的原始代码却无法通过XPath获取文本值,原始代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By import time with open('restaurants.csv', 'w', encoding='utf-8') as file: file.write('name \n') driver = webdriver.Chrome() driver.get('https://www.tripadvisor.co.nz/Restaurants-g1811027-Auckland_North_Island.html') time.sleep(3) name = driver.find_elements(By.XPATH,"//div[@class='biGQs _P fiohW alXOW NwcxK GzNcM ytVPx UTQMg RnEEZ ngXxk']/a") with open('restaurants.csv', 'a', encoding='utf-8') as file: for i in range(len(name)): file.write(name.text +'\n') file.close driver.quit
错误原因分析
- 元素列表调用
text属性错误:driver.find_elements()返回的是一个元素列表(name变量),你在循环里写name.text是对整个列表调用text属性,而不是列表中的单个元素。正确应该是name[i].text,或者直接像成功代码那样遍历列表中的每个元素。 - 方法调用遗漏括号:
driver.quit和file.close都没有加括号,这两个是方法,必须加括号才能执行(driver.quit()、file.close())。不过因为你用了with语句管理文件,file.close()其实可以省略,with会自动关闭文件。 - 变量命名混淆:把元素列表命名为
name(单数)容易混淆,建议改成复数names,和成功代码保持一致,避免逻辑上的误解。
修正后的代码
from selenium import webdriver from selenium.webdriver.common.by import By import time with open('restaurants.csv', 'w', encoding='utf-8') as file: file.write('name \n') driver = webdriver.Chrome() driver.get('https://www.tripadvisor.co.nz/Restaurants-g1811027-Auckland_North_Island.html') time.sleep(3) names = driver.find_elements(By.XPATH,"//div[@class='biGQs _P fiohW alXOW NwcxK GzNcM ytVPx UTQMg RnEEZ ngXxk']/a") with open('restaurants.csv', 'a', encoding='utf-8') as file: # 方式1:直接遍历元素(推荐) for name in names: file.write(name.text + '\n') # 方式2:索引遍历写法 # for i in range(len(names)): # file.write(names[i].text + '\n') driver.quit() # 必须加括号执行方法
内容的提问来源于stack exchange,提问作者user23448952
相关产品推荐
相关产品推荐

