使用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

