Python 3中BeautifulSoup如何定位reviews->row->row层级的row类元素
针对当前解析需求的实现方案
问题根因
你之前写法失效的本质原因是:row是前端栅格框架的通用类名,整页从导航栏、侧边栏到页脚模块都会批量使用这个类,从页面根节点全局搜索div.row,第一个匹配到的元素通常是顶部导航相关的容器,和目标正文区完全没关系。
你要找的内容有固定的DOM层级链路:reviews -> row -> row,必须顺着层级逐级定位,不能跨节点做全局匹配。
具体实现思路
- 先定位最外层带
reviews类的容器,这个类是文章正文区专属的标识,页面里不会出现大量重复,定位准确率极高 - 从这个
reviews容器开始,顺着DOM结构逐层向下找嵌套的row元素,查找时加上recursive=False参数,严格限定只找当前节点的直接子元素,避免层级匹配错位 - 定位到三层路径终点的
row元素后,再提取里面的正文段落、配图、链接等内容即可
可直接复用的参考代码
soup = BeautifulSoup(response.content, "html.parser") # 定位正文区最外层专属容器 reviews_container = soup.find("div", class_="reviews") # 严格按DOM层级逐级匹配,限定只查直接子节点避免抓错元素 first_level_row = reviews_container.find("div", class_="row", recursive=False) target_article_area = first_level_row.find("div", class_="row", recursive=False) # 示例:提取目标区域内所有非空的正文段落 paragraph_list = target_article_area.find_all("p") full_article_text = "\n".join( [para.get_text(strip=True) for para in paragraph_list if para.get_text(strip=True)] )
实操注意点
- 千万不要省略
recursive=False参数,如果去掉这个参数,查找逻辑会自动往节点深层递归,很容易匹配到层级不符的row元素 - 原代码里的变量名
cnbeta_article_content和当前解析的站点不匹配,建议顺手改成对应站点的命名,避免后续维护的时候犯迷糊 - 即使目标row元素带了其他额外的类名(比如
row g-0这类栅格附加类),class_="row"的写法依然可以正常匹配,不需要抄下完整的类名字符串做精确字符串匹配 - 如果需要保留文章内的图片、跳转链接这类富媒体内容,不需要单独写复杂的解析逻辑,直接遍历
target_article_area下的对应标签提取属性值即可
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

