如何使用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
相关产品推荐
相关产品推荐

