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

为什么BeautifulSoup使用find_all结合XPath返回空结果?

问题原因与解决方法

核心原因

BeautifulSoup的find_all()方法不支持XPath语法,你传入的XPath字符串会被当作要查找的标签名处理——显然网页中不存在名为//*[@id="economic-calendar-events"]/table/tbody/tr的标签,所以返回空结果。

两种可行的解决方案

方案1:直接用Selenium执行XPath查找

既然已经在使用Selenium驱动浏览器,完全可以直接用Selenium的API通过XPath定位元素,无需再转BeautifulSoup:

# 替换原代码中soup相关的部分
tr_elements = driver.find_elements(By.XPATH, '//*[@id="economic-calendar-events"]/table/tbody/tr')
print('tr_elements size=' + str(len(tr_elements)))

方案2:用BeautifulSoup支持的语法查找

如果一定要用BeautifulSoup处理页面源码,可以将XPath转换成它支持的CSS选择器或者标签+属性的查找方式:

# 方式A:用CSS选择器(对应你的XPath)
tr_elements = soup.select('#economic-calendar-events table tbody tr')

# 方式B:分步查找
calendar_container = soup.find(id='economic-calendar-events')
table = calendar_container.find('table')
tbody = table.find('tbody')
tr_elements = tbody.find_all('tr')

print('tr_elements size=' + str(len(tr_elements)))

额外提示

  • 网页的tbody可能是浏览器渲染时自动添加的,实际源码中可能不存在,这种情况下直接查找table下的tr即可:
    # 针对tbody可能不存在的情况
    tr_elements = soup.select('#economic-calendar-events table tr')
    
  • 避免用固定的time.sleep()等待页面加载,建议用Selenium的显式等待,更稳定:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 等待目标元素加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="economic-calendar-events"]/table/tbody/tr'))
    )
    

内容的提问来源于stack exchange,提问作者Kannan J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:40:16