You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:36:28