如何从Quora评论区悬浮元素中提取评论者所在地?
Quora评论区作者所在地提取问题修复
问题根源
你代码里用了全局XPath查找所在地,每次都会命中页面第一个符合条件的元素(也就是发帖人的信息),而非当前悬停的评论作者。另外,你直接把元素对象存进列表,没提取文本,结果自然不对。
修复后的代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC cmts = [] all_comments = driver.find_elements(By.CSS_SELECTOR, 'div[class="q-box qu-ml--small qu-flex--auto"]') for comment in all_comments: # 定位当前评论的作者链接 cmter_link = comment.find_element(By.CSS_SELECTOR, 'a.q-box.puppeteer_test_link.qu-color--gray_dark.qu-cursor--pointer.qu-hover--textDecoration--underline') # 悬停作者链接触发弹窗 webdriver.ActionChains(driver).move_to_element(cmter_link).perform() # 显式等待弹窗加载,替代固定sleep更靠谱 try: # 只在当前悬停的弹窗里找所在地,避免全局匹配 loc_element = WebDriverWait(driver, 3).until( EC.presence_of_element_located( (By.XPATH, '//div[contains(@class, "q-popover")]//div[@class="q-text qu-truncateLines--2"][contains(., "Lives in") or contains(., "Lived in")]/span/span') ) ) cmterloc = loc_element.text except: cmterloc = 'None' # 提取评论内容,去掉首尾空白 cmt_content = comment.find_element(By.CSS_SELECTOR, 'div.q-text').text.strip() # 过滤空评论和重复条目 if cmt_content and [cmter_link.text, cmterloc, cmt_content] not in cmts: cmts.append([cmter_link.text, cmterloc, cmt_content]) # 输出预期格式的结果 for entry in cmts: print(entry)
核心修改说明
- 锁定弹窗范围:用
q-popover容器限定查找范围,确保只抓取当前悬停作者的弹窗信息,不会错拿发帖人数据。 - 提取文本内容:把
cmterloc改成获取元素的.text,存的是真实的所在地字符串,而非无效的元素对象。 - 替换固定等待:用显式等待替代
time.sleep,等弹窗加载完成再抓取,避免因加载慢导致的失败。 - 简化选择器:去掉冗余的长类名,保留关键标识,让选择器更稳定,不容易因为页面样式更新失效。
内容的提问来源于stack exchange,提问作者LaurenLai
相关产品推荐
相关产品推荐

