BeautifulSoup按class查找AllMusic页面元素返回空列表如何解决
问题解决方法
你遇到的问题有三个常见诱因,对应解决方法如下:
- 第一:请求未携带浏览器标识,被站点反爬策略拦截,返回的不是正常搜索结果页面
解决方法:发送请求时补充User-Agent请求头模拟浏览器访问,同时URL中的特殊字符需要提前编码,不要直接在URL中写入双引号,修改后的请求代码如下:import requests from bs4 import BeautifulSoup headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 使用编码后的URL,%22对应双引号 url = "https://www.allmusic.com/search/songs/%22hola%22" results = requests.get(url, headers=headers) # 可先打印状态码和返回内容前500字符,确认返回的是正常搜索页面 print(results.status_code) print(results.text[:500]) soup = BeautifulSoup(results.text, 'html.parser') print(soup.find_all("li", class_="song")) - 第二:默认解析器适配性不足
如果补充请求头后仍然返回空列表,可以将解析器替换为容错性更高的lxml,需要先执行pip install lxml安装依赖,再修改解析代码为:soup = BeautifulSoup(results.text, 'lxml') - 第三:页面内容为前端动态渲染
若上述方法都无效,说明搜索结果是通过JavaScript动态加载的,直接请求原始HTML不会包含目标元素,此时可以使用Selenium等自动化工具模拟浏览器加载完整页面后再解析:from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.get("https://www.allmusic.com/search/songs/%22hola%22") # 等待页面加载完成 driver.implicitly_wait(10) page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') print(soup.find_all("li", class_="song")) driver.quit()
注意:爬取站点内容时请控制请求频率,遵守站点的robots协议规则,避免对站点服务造成影响。
内容的提问来源于stack exchange,提问作者miguelsxvi
相关产品推荐
相关产品推荐

