如何用Beautiful Soup抓取单个div标签下的所有段落内容?
网页抓取问题解决方案
你的代码返回None,大概率是以下两种情况之一:
- 目标div的class名称写错了(比如实际页面里class有空格、大小写差异,或者你拼写错误)
- 页面内容是动态加载的(仅用requests无法获取到渲染后的内容)
下面针对不同情况给出解决方案:
静态页面(内容直接在HTML源码里)
修正后的代码可以直接抓取目标文本并存入列表:
import requests from bs4 import BeautifulSoup as bsoup url = "http://www.url.com/url.html" response = requests.get(url) # 用response.text避免编码乱码问题 soup = bsoup(response.text, "lxml") # 定位单个目标div,用find比findAll更高效 target_div = soup.find("div", class_="unique-phrase") if target_div: # 提取div下所有p标签的文本,不管p标签的属性 paragraph_list = [p.get_text(strip=True) for p in target_div.find_all("p")] print(paragraph_list) else: print("没找到目标div,请检查class名称是否正确,或页面结构是否变化")
关键细节
- 用
class_参数指定div的class(因为class是Python关键字,BeautifulSoup专门做了这个兼容),你之前的{"class": "unique-phrase"}写法也有效,但class_更简洁 get_text(strip=True)会自动去掉文本前后的空格、换行符,让结果更整洁- 加个判断避免找不到div时直接报错
动态页面(内容由JavaScript渲染)
如果用requests抓不到内容,说明页面是动态加载的,需要用Selenium模拟浏览器渲染:
from selenium import webdriver from selenium.webdriver.common.by import By from bs4 import BeautifulSoup as bsoup url = "http://www.url.com/url.html" # 需要提前安装ChromeDriver并配置环境变量 driver = webdriver.Chrome() driver.get(url) # 隐式等待10秒,确保页面加载完成 driver.implicitly_wait(10) # 获取渲染后的页面源码 soup = bsoup(driver.page_source, "lxml") target_div = soup.find("div", class_="unique-phrase") if target_div: paragraph_list = [p.get_text(strip=True) for p in target_div.find_all("p")] print(paragraph_list) else: print("没找到目标div") # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者rexregisanimi
相关产品推荐
相关产品推荐

