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

从解析后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:01