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

如何使用BeautifulSoup4在网页爬取中分离嵌套标签文本

解决BeautifulSoup提取嵌套标签文本的问题

一、提取父标签自身文本(忽略子标签)

要获取<p>标签里的主价格数字(排除子<span>内容),可以利用BeautifulSoup的节点遍历方法:

方法1:使用next_element定位直接文本节点

next_element指向标签的第一个子节点(即主价格的文本部分),结合第一个<span>的货币单位即可组合主价格:

price_tag = item.find('p', {"class": "teaserUnified__price"})
# 提取主价格数字并去除空格
main_price_num = price_tag.next_element.strip().replace(' ', '')
# 提取货币单位
currency = price_tag.find('span').text.strip()
# 组合完整主价格
main_price = f"{main_price_num}{currency}"

方法2:通过contents获取子节点列表

<p>的contents属性返回所有直接子节点,第一个元素是主价格文本,第二个是货币单位的<span>:

price_tag = item.find('p', {"class": "teaserUnified__price"})
main_price_num = price_tag.contents[0].strip().replace(' ', '')
currency = price_tag.contents[1].text.strip()
main_price = f"{main_price_num}{currency}"

二、分离主价格与附加价格

附加价格位于类名为teaserUnified__additionalPrice的<span>标签内,直接定位该标签即可提取:

price_tag = item.find('p', {"class": "teaserUnified__price"})
# 提取主价格(任选上述一种方法)
main_price_num = price_tag.next_element.strip().replace(' ', '')
currency = price_tag.find('span').text.strip()
main_price = f"{main_price_num}{currency}"

# 提取附加价格
additional_price_tag = price_tag.find('span', {"class": "teaserUnified__additionalPrice"})
additional_price = additional_price_tag.text.strip().replace(' ', '') if additional_price_tag else None

如果想一次性获取所有文本片段,也可以用stripped_strings遍历(自动去除空白字符):

price_tag = item.find('p', {"class": "teaserUnified__price"})
all_text_fragments = list(price_tag.stripped_strings)
# 片段列表示例:['1 437 969', 'zł', '10 490 zł/m²']
main_price = f"{all_text_fragments[0].replace(' ', '')}{all_text_fragments[1]}"
additional_price = all_text_fragments[2].replace(' ', '')

三、修改后的完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

r = requests.get('https://gratka.pl/nieruchomosci/domy/wroclaw')
c = r.content
soup = BeautifulSoup(c,'html.parser')
all_items = soup.find_all('div',{"class":"listing__teaserWrapper"})

prices_data = []
for item in all_items:
    price_tag = item.find('p', {"class": "teaserUnified__price"})
    if not price_tag:
        continue  # 跳过无价格条目
    
    # 提取主价格
    main_price_num = price_tag.next_element.strip().replace(' ', '')
    currency = price_tag.find('span').text.strip()
    main_price = f"{main_price_num}{currency}"
    
    # 提取附加价格
    additional_price_tag = price_tag.find('span', {"class": "teaserUnified__additionalPrice"})
    additional_price = additional_price_tag.text.strip().replace(' ', '') if additional_price_tag else None
    
    prices_data.append({
        '主价格': main_price,
        '附加价格': additional_price
    })

# 转为DataFrame查看结果
df = pd.DataFrame(prices_data)
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:37:27