Selenium Python抓取Telegram频道消息时出现TypeError报错
抓取Telegram频道最后一条消息的报错解决
问题场景
我尝试抓取Telegram频道的最后一条消息,打印其中文本或将其存入变量供后续使用,编写了以下代码:
from cgitb import text from http import server from re import search import selenium import time import sys 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 selenium.webdriver.common.keys import Keys PATH = "/usr/local/bin/chromedriver" driver = webdriver.Chrome(PATH) driver.get("https://t.me/s/klfjezlkjfzlek") test = driver.find_element(By.XPATH("//html//body//main//div//section//div//div//div//div[@class='tgme_widget_message_text js-message_text before_footer'][last()]")) source_code = test.text print(source_code)
运行后出现如下错误:
Traceback (most recent call last): File "/Users/usr/Desktop/tg.py", line 16, in <module> text=driver.find_element(By.XPATH("//html//body//main//div//section//div//div//div//div[@class='tgme_widget_message_text js-message_text before_footer'][last()]")) TypeError: 'str' object is not callable
错误原因
这个报错是因为调用driver.find_element时参数传递错误。你把定位方式By.XPATH和XPATH表达式合并成了一个字符串传入,但find_element需要两个独立参数:第一个是定位策略(如By.XPATH),第二个是对应的定位表达式。
修正方案
1. 修正参数传递格式
把find_element的参数拆分成两个,正确写法如下:
test = driver.find_element(By.XPATH, "//html//body//main//div//section//div//div//div//div[@class='tgme_widget_message_text js-message_text before_footer'][last()]")
2. 增加页面等待(可选但推荐)
直接调用find_element可能因为页面未加载完成导致元素找不到,建议用WebDriverWait等待元素加载完成,避免NoSuchElementException:
完整修正后的代码:
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 import time PATH = "/usr/local/bin/chromedriver" driver = webdriver.Chrome(PATH) driver.get("https://t.me/s/klfjezlkjfzlek") # 等待元素加载,最长等待10秒 test = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[@class='tgme_widget_message_text js-message_text before_footer'][last()]")) ) source_code = test.text print(source_code) driver.quit() # 记得关闭浏览器
另外可以简化XPATH表达式,不需要写全//html//body//main...,直接定位目标class的div即可,更简洁可靠。
内容的提问来源于stack exchange,提问作者Nina Shorapova
相关产品推荐
相关产品推荐

