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

使用BeautifulSoup无法定位HTML中div.title元素的排查求助

问题:使用BeautifulSoup抓取NPR 2022最佳书籍页面返回空列表的排查技巧

尝试运行以下代码抓取https://apps.npr.org/best-books/#view=list&year=2022页面的书籍名称,代码在基础场景中可用,但实际返回空列表:

import requests
from bs4 import BeautifulSoup

url = 'https://apps.npr.org/best-books/#view=list&year=2022'

page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

soup.find_all('div',{'class':'title'})

目标元素示例:

<div class="title">(Serious) New Cook: Recipes, Tips, and Techniques</div>

排查技巧

  • 检查请求返回的原始HTML内容:
    requests.get()只能获取页面初始静态HTML,若书籍内容由JavaScript动态加载,初始HTML中不会包含目标元素。可将返回内容保存到本地文件查看:

    with open('page.html', 'w', encoding='utf-8') as f:
        f.write(page.text)
    

    打开文件后搜索class="title",确认元素是否存在。

  • 验证请求状态与请求头:
    先打印响应状态码print(page.status_code),若返回403/404等非200状态,说明请求被拦截或页面不存在。可添加浏览器请求头模拟正常访问:

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    page = requests.get(url, headers=headers)
    
  • 确认元素的class属性准确性:
    检查实际HTML中目标元素的class是否与代码中的title完全一致,是否存在多class(如title book-title)或拼写错误。可在浏览器开发者工具中复制元素的完整class属性进行核对。

  • 尝试从上层容器逐层查找元素:
    避免直接全局查找,先定位书籍项的上层容器,再在容器内查找title元素,减少因DOM结构嵌套导致的查找失败:

    # 示例(需根据实际DOM结构调整上层容器的class)
    book_containers = soup.find_all('div', class_='book-item')
    for container in book_containers:
        title = container.find('div', class_='title')
        if title:
            print(title.get_text(strip=True))
    
  • 使用浏览器渲染工具抓取动态内容:
    若确认内容由JavaScript动态生成,改用Selenium、Playwright等工具模拟浏览器加载页面,等待JS执行完成后再抓取:

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    driver = webdriver.Chrome()
    driver.get('https://apps.npr.org/best-books/#view=list&year=2022')
    # 可添加等待时间确保内容加载完成
    import time
    time.sleep(3)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    titles = soup.find_all('div', class_='title')
    print([title.get_text(strip=True) for title in titles])
    driver.quit()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:10:28