BS4 findAll无法返回全部div求助:获取目标表格失败
嘿,我一眼就看出问题所在啦!
为啥你的代码拿不到目标内容?
你用urllib.request抓取到的只是网站的初始静态HTML文件,而这个网站的核心内容(包括你要找的底部表格、那两个始终返回[]的div)都是通过JavaScript动态渲染生成的。URL里的#eu/sylvanas/item/124105属于前端路由——浏览器加载完初始HTML后,会通过JS异步请求数据,再把内容渲染到页面上,但urllib和BeautifulSoup都没有执行JavaScript的能力,所以你拿到的BeautifulSoup对象里根本不存在那些动态生成的元素,findAll()自然返回空啦。
解决办法:用能执行JS的工具抓取渲染后内容
这里给你两个实用的方案,都是开发者常用的:
方案1:用Selenium模拟浏览器(最稳定)
Selenium可以模拟真实浏览器的行为,等待页面JS执行完成后再获取完整的页面源码。示例代码如下:
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 from bs4 import BeautifulSoup # 初始化Chrome浏览器(需要提前安装对应版本的chromedriver) driver = webdriver.Chrome() driver.get("https://theunderminejournal.com/#eu/sylvanas/item/124105") # 等待目标元素加载完成(最多等10秒) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "item-page")) ) # 获取渲染后的完整页面源码 page_source = driver.page_source bsObj = BeautifulSoup(page_source, 'html.parser') test = bsObj.findAll('div', {'class':'page','id':"item-page"}) print(test) finally: # 用完记得关闭浏览器 driver.quit()
方案2:用requests-html(轻量简洁)
requests-html是requests的扩展库,自带JS执行能力,用法比Selenium简单:
from requests_html import HTMLSession from bs4 import BeautifulSoup session = HTMLSession() # 发送请求并执行JS渲染页面 r = session.get("https://theunderminejournal.com/#eu/sylvanas/item/124105") r.html.render() # 解析渲染后的页面 bsObj = BeautifulSoup(r.html.html, 'html.parser') test = bsObj.findAll('div', {'class':'page','id':"item-page"}) print(test)
小提示
你可以先把urllib抓取到的初始HTML打印出来看看,会发现里面完全没有你要找的那两个div,这就能实锤是动态加载的问题啦!
内容的提问来源于stack exchange,提问作者Andrej Licanin
相关产品推荐
相关产品推荐

