从解析后的HTML页面提取Tweet ID时遇问题,请求技术帮助
解决获取非转发推文ID的问题
看起来你的代码卡在了判断非转发推文的环节上,我来帮你梳理几个可能的原因和对应的解决方案:
1. 推文选择器可能已失效
Twitter的页面结构经常更新,div.tweet这个旧选择器大概率已经不适用了。现在Twitter的推文容器通常用data-testid="tweet"来标识,你可以先替换选择器,确保能正确抓取到所有推文元素:
# 替换原选择器为当前通用的标识 tweets = page_soup.select('div[data-testid="tweet"]') print(f"实际抓到的推文数量:{len(tweets)}")
2. data-name判断逻辑的漏洞
原代码直接用tweet['data-name']可能会触发KeyError(因为有些推文可能没有这个属性),而且用户名的格式也可能不匹配(比如大小写、多余空格)。如果坚持用这个属性判断,要先做存在性检查和格式统一:
name = stat["Full_Name"].strip().lower() # 统一格式,避免大小写/空格问题 for tweet in tweets: # 先确认属性存在,再做匹配 if 'data-name' in tweet.attrs: tweet_name = tweet['data-name'].strip().lower() if tweet_name == name: tweet_id = tweet.get('data-tweet-id') or tweet.get('data-id') if tweet_id: # 确保ID存在再添加 tweet_ids.append(tweet_id)
3. 更可靠的非转发推文判断方式
用data-name判断非转发其实不太准确,毕竟转发推文也可能包含原作者的名字。更可靠的方法是检查推文里是否有转发专属的元素——Twitter会给转发推文加上data-testid="retweet"的标记:
for tweet in tweets: # 检查是否存在转发元素,不存在则为原创推文 retweet_tag = tweet.find('div', {'data-testid': 'retweet'}) if retweet_tag is None: # 抓取推文ID,兼容不同属性名 tweet_id = tweet.get('data-tweet-id') or tweet.get('data-id') if tweet_id: tweet_ids.append(tweet_id)
额外调试建议
- 在循环里打印
tweet.attrs,看看每个推文元素实际包含哪些属性,确认data-tweet-id和data-name是否真的存在; - 检查
stat["Full_Name"]的输出是否符合预期,有没有多余的空格或大小写差异; - 确保Selenium已经等待页面完全加载,动态内容需要用
WebDriverWait等待元素加载完成后再解析HTML,避免抓空。
内容的提问来源于stack exchange,提问作者Elvin Jafali
相关产品推荐
相关产品推荐

