运行Twitter推文爬取代码报AttributeError: 'NoneType' object has no attribute 'getText'如何解决
报错原因
- 你使用的爬取逻辑是基于多年前旧版Twitter(现X平台)的前端结构开发的,旧版本用到的
js-tweet-text推文内容类名早已在平台迭代中被弃用,soup.find()无法匹配到对应元素会返回None,此时调用getText()方法就会触发你遇到的报错。 - 当前X平台的所有推文内容都是通过JavaScript动态渲染生成的,直接用
urllib.request请求拿到的只是未执行JS的初始静态HTML源码,本身就不包含实际渲染后的推文内容,自然找不到对应元素。 - 你贴出的代码存在笔误,
filter = re.findall(r'"(.*)"', x)ut末尾多打了ut字符,需要先删除。
调整方案
方案1:使用支持动态渲染的爬取工具
采用Selenium、Playwright等工具模拟真实浏览器运行,等待页面JS执行完成、内容渲染完毕后再提取元素,同时替换为当前平台稳定的元素选择器。
使用前需要先安装对应依赖:pip install selenium,并下载和你浏览器版本匹配的驱动。
调整后的示例代码如下:
from bs4 import BeautifulSoup as soupy import re 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 # 初始化浏览器 driver = webdriver.Chrome() driver.get('https://twitter.com/samad_bloch0x1') # 等待推文元素加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="tweetText"]'))) # 获取渲染完成的页面源码 html = driver.page_source soup = soupy(html, features="html.parser") # 替换为当前平台有效的推文选择器,先判断是否找到元素避免报错 tweet_elem = soup.find('div', {'data-testid': 'tweetText'}) if tweet_elem: x = tweet_elem.getText() filter_res = re.findall(r'"(.*)"', x) if filter_res: tweet = filter_res[0] print(tweet) else: print("未匹配到符合规则的内容") else: print("未找到推文内容") driver.quit()
方案2:使用官方开发接口
直接申请X平台的公开开发者接口获取推文数据,这种方式稳定性更高,不需要应对前端结构变化的适配问题,返回的结构化数据也更方便处理。
内容的提问来源于stack exchange,提问作者Sem
相关产品推荐
相关产品推荐

