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

使用Selenium爬取HuggingFace论坛时,无法从嵌套主题页提取楼主用户名

使用Selenium爬取HuggingFace论坛时,无法从嵌套主题页提取楼主用户名

我完全懂你现在的困扰——主页面的活动日期、浏览量这些信息都能顺利抓取,但一进入单个主题页,明明知道楼主用户名的HTML位置,却死活拿不到数据。咱们来一步步排查并解决这个问题:

问题根源分析

你当前代码里定位用户名的CSS选择器是span.first.username.new-user,这里最容易出问题的是**new-user这个类名**——它只有论坛新用户才会被标记,老用户的用户名元素是没有这个类的!这就导致遇到非新用户的帖子时,你的选择器直接找不到元素,只能返回"N/A"。

另外,你用的presence_of_element_located等待条件只保证元素存在于DOM中,但不确保元素已经可见或者文本已经加载完成,这也可能导致提取失败。

解决方案

1. 修正CSS选择器,去掉专属新用户的类

把定位用户名的选择器改成span.first.username a,这样不管是新用户还是老用户,都能匹配到用户名的链接元素:

def scrape_issue_details(url):
    """
    Navigate to the topic page and scrape additional details like the owner's username.
    """
    # Go to the topic page
    driver.get(url)
    time.sleep(3)  # Wait for the page to load

    # Extract the owner's username
    try:
        owner_elem = WebDriverWait(driver, 10).until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, 'span.first.username a'))
        )
        owner_username = owner_elem.text.strip()
    except Exception as e:
        owner_username = "N/A"  # Default value if no owner found

    return owner_username

2. 优化等待条件,确保元素可见

把presence_of_element_located换成visibility_of_element_located,这样会等待元素完全可见后再进行提取,避免DOM加载完成但元素还没渲染好的情况。

3. 可选:用新标签页打开主题页,提升爬取效率

每次用driver.get(url)跳转到主题页后,再返回主页面需要重新加载,效率很低。可以改用新标签页打开主题页,处理完再切回主页面:

def scrape_issue_details(url):
    # 打开新标签页
    driver.execute_script("window.open('');")
    # 切换到新标签页
    driver.switch_to.window(driver.window_handles[1])
    driver.get(url)
    
    try:
        owner_elem = WebDriverWait(driver, 10).until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, 'span.first.username a'))
        )
        owner_username = owner_elem.text.strip()
    except Exception as e:
        owner_username = "N/A"
    
    # 关闭新标签页,切回主页面
    driver.close()
    driver.switch_to.window(driver.window_handles[0])
    return owner_username

4. 额外优化:修复主页面去重逻辑

你当前代码里重复添加了两次去重数据(topic_id和(title, full_link)),其实只用topic_id就足够了,避免冗余:

# 去掉这一行,只保留topic_id的去重逻辑
# seen_titles_and_links.add((title, full_link))

测试验证

在浏览器开发者工具的控制台里,输入document.querySelector('span.first.username a'),如果能正确选中楼主的用户名元素,说明选择器没问题。如果还是不行,可以检查是否有iframe嵌套(不过HuggingFace论坛的用户信息不在iframe里),或者是否有动态加载的情况——如果是动态加载,可以尝试延长等待时间,或者检查Network面板的AJAX请求,确认用户信息是否通过接口加载。

备注:内容来源于stack exchange,提问作者Nothin Karwy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:17:58