为什么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
相关产品推荐
相关产品推荐

