如何用BeautifulSoup获取多层<div>内容及嵌套<div>中的时间数据?
嘿,我来帮你搞定这两个BeautifulSoup的问题,顺便揪出你代码失效的原因~
问题1:如何获取多层
标签后的内容
首先得明确“多层div”的结构——是嵌套的层级关系,还是同级的多层?不管哪种,核心是用对CSS选择器或者BeautifulSoup的查找方法:
- 如果是嵌套多层的div(比如
<div class="level1"><div class="level2"><div class="level3">目标内容</div></div></div>):- 用CSS层级选择器:
soup.select_one(".level1 .level2 .level3").text(空格表示后代元素,不管嵌套多少层) - 或者链式调用
find:soup.find("div", class_="level1").find("div", class_="level2").find("div", class_="level3").text
- 用CSS层级选择器:
- 如果是同级的多层div(比如连续几个div在同一父容器下):
- 用
soup.select("div.parent > div")(>表示直接子元素)来获取所有同级子div,再遍历提取内容
- 用
你之前代码里的soup.select("div.div")是错误的——这个选择器是找所有class="div"的div标签,但你提供的HTML样本里目标是class='row'的div,这完全不匹配,所以代码没生效!
问题2:如何获取嵌套在两层
中的时间数据(示例:
<div><div>6:00.00</div></div>) 这种两层嵌套的结构很简单,有几种高效的方法:
- 方法1:链式find
直接逐层查找:time_text = soup.find("div").find("div").get_text(strip=True) print(time_text) # 输出:6:00.00 - 方法2:CSS子选择器
用>指定直接子元素,精准定位:time_elem = soup.select_one("div > div") if time_elem: print(time_elem.get_text(strip=True)) - 方法3:批量获取(如果页面有多个这样的结构)
如果页面里有多处两层嵌套的时间div,遍历提取:time_elements = soup.select("div > div") for elem in time_elements: text = elem.get_text(strip=True) # 可以加个判断,筛选出时间格式的内容 if ":" in text and "." in text: print("找到时间:", text)
修正后的完整代码示例
结合你爬取的项目页面,我调整了代码,帮你正确获取内容:
import requests from bs4 import BeautifulSoup page = requests.get("https://www.energystorageexchange.org/projects/2") soup = BeautifulSoup(page.content, 'lxml') # 示例1:获取class="row"的div下的多层内容 rows = soup.select("div.row") for row in rows: # 提取row下所有嵌套div的文本内容 nested_texts = [div.get_text(strip=True) for div in row.select("div") if div.get_text(strip=True)] if nested_texts: print("行内容:", " | ".join(nested_texts)) # 示例2:查找页面中两层嵌套的时间数据 time_candidates = soup.select("div > div") for candidate in time_candidates: text = candidate.get_text(strip=True) if len(text) >= 5 and ":" in text: # 简单判断时间格式 print("匹配到时间:", text)
内容的提问来源于stack exchange,提问作者pickenpack
相关产品推荐
相关产品推荐

