使用Python BeautifulSoup爬取resultColumn失败求助
解决无法爬取
resultColumn内容的问题 Hey,我来帮你搞定这个问题~
问题出在哪?
首先,你用urllib直接请求拿到的只是页面的初始静态HTML,而页面里的resultColumn区域内容是通过JavaScript动态加载出来的——也就是说,当你请求页面时,这部分内容还没生成,得等浏览器执行完JS才会出现,所以BeautifulSoup自然找不到它。另外你的代码里查找元素的语法也有点小错误:containers[6].findAll("div","id":"resultColumn")应该写成containers[6].findAll("div", {"id": "resultColumn"}),不过这不是核心问题,就算改对了也拿不到内容。
两个可行的解决方案
方案一:用Selenium模拟浏览器加载(最直观)
Selenium会模拟真实浏览器打开页面,执行所有JS代码,这样就能获取到动态渲染后的内容了。
第一步,先安装Selenium和对应浏览器的驱动:
pip install selenium
然后去下载对应浏览器的驱动(比如Chrome的ChromeDriver),要和你的浏览器版本匹配,把它放到环境变量或者指定路径。
然后用下面的代码试试:
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 as soup # 初始化Chrome浏览器驱动(如果驱动不在环境变量,要指定路径:webdriver.Chrome(executable_path="你的ChromeDriver路径")) driver = webdriver.Chrome() my_url = 'https://www.nab.com.au/locations?return#lunch' driver.get(my_url) # 等待resultColumn加载出来,最多等10秒 try: # 等元素出现 result_column = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "resultColumn")) ) # 获取这个区域的HTML result_html = result_column.get_attribute('innerHTML') print(result_html) # 要是想用BeautifulSoup解析,就继续处理 page_soup = soup(result_html, "html.parser") # 比如提取里面的文本内容 all_text = page_soup.get_text(strip=True) print(all_text) finally: # 用完记得关浏览器 driver.quit()
方案二:直接抓API接口(更高效)
如果你不想用浏览器模拟,可以打开浏览器的开发者工具(按F12),切换到Network标签,刷新页面,找加载门店数据的XHR请求——一般动态内容都是通过API接口获取的,找到那个接口后直接请求它,就能拿到结构化的JSON数据,比解析HTML方便多了。
举个示例(你需要自己找到实际的API地址):
import requests # 替换成你在Network里找到的真实API地址 api_url = "https://example.com/api/locations" response = requests.get(api_url) data = response.json() # 直接处理JSON数据就行 print(data)
内容的提问来源于stack exchange,提问作者hdrajani
相关产品推荐
相关产品推荐

