如何遍历带自定义标识的嵌套元素树实现USNews网站内容抓取
如何遍历带自定义标识的嵌套元素树实现USNews网站内容抓取
我太懂你抓USNews的痛苦了!他们家的页面元素经常搞动态渲染,加上搜索结果还套了Google CSE的跳转链接,定位起来特别挠头。你之前遇到的空列表问题,大概率是元素还没加载完成就去定位,或者定位路径不够精准导致的,咱们一步步来解决:
一、先解决「元素找不到」的核心问题:等待DOM渲染完成
USNews的搜索结果是动态加载的,直接用find_elements会因为页面还没渲染完,DOM里根本没有目标元素,所以一定要用显性等待(比硬写time.sleep靠谱多了),让代码等元素出现后再执行操作。
二、精准定位第一个搜索结果链接
你要找的第一个链接其实有个非常靠谱的标识:data-tracking-placement="1",这个是搜索结果的位置标记,第一个结果就是1,用这个属性定位比依赖class名稳定得多(毕竟class名可能随网站更新变化)。
完整可运行的代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time from urllib.parse import urlparse, parse_qs # 初始化浏览器驱动(这里以Chrome为例,记得对应你的浏览器版本) driver = webdriver.Chrome() # 替换成你要访问的USNews搜索页面URL target_url = "你的USNews搜索页面地址" driver.get(target_url) # 给页面一点初始加载时间(配合显性等待更稳妥) time.sleep(2) try: # 显性等待第一个搜索结果链接出现,最长等待10秒 first_result_link = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//a[@data-tracking-placement="1"]')) ) # 获取链接的原始跳转地址(这个是Google CSE的中转链接) raw_href = first_result_link.get_attribute('href') print("原始跳转链接:", raw_href) # 如果需要直接点击跳转页面 # first_result_link.click() # 直接提取真实的USNews目标地址(解析url中的q参数) parsed_url = urlparse(raw_href) real_usnews_url = parse_qs(parsed_url.query)['q'][0] print("真实USNews链接:", real_usnews_url) except Exception as e: print("定位元素出错:", str(e)) finally: # 关闭浏览器 driver.quit()
为什么你之前的代码会返回空列表?
- 没有等待元素加载:页面还在动态渲染时就执行了
find_elements,此时DOM里还没有usn-site-search-item这个li元素,自然返回空。 - 旧版API问题:
find_elements_by_xpath是Selenium的旧版方法,现在推荐使用find_element(By.XPATH, ...)这种符合新版规范的写法。 - 定位路径不够精准:依赖class名定位容易受页面样式更新影响,而
data-tracking-placement这类业务属性一般不会轻易变动。
额外注意事项
- USNews有反爬机制,频繁请求可能会被限制访问,建议每次操作后加随机等待(比如
time.sleep(random.uniform(2,5))),或者使用代理IP。 - 如果还是找不到元素,可以检查页面是否有iframe嵌套,若存在需要先切换到对应的iframe再定位元素。
备注:内容来源于stack exchange,提问作者MsTais
相关产品推荐
相关产品推荐

