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

如何格式化打印BeautifulSoup返回的HTML标签列表内容

解决方法:逐个处理列表中的Tag对象并调用prettify()

嗨,问题出在你直接打印整个listings结果集的时候——这个结果集是BeautifulSoup的ResultSet对象(本质是Tag元素的列表),直接打印它会把所有Tag的紧凑字符串形式拼接在一起,自然看起来是一大块。要实现类HTML格式、每个标签单独一行的效果,你需要逐个遍历列表里的每个Tag元素,调用它的prettify()方法。

修改后的代码示例

你可以把最后打印的部分改成这样:

import requests, bs4

def make_soup():
    url = 'https://www.airbnb.pl/s/Girona--Hiszpania/homes?place_id=ChIJRRrTHsPNuhIRQMqjIeD6AAM&query=Girona%2C%20Hiszpania&refinement_paths%5B%5D=%2Fhomes&allow_override%5B%5D=&s_tag=b5bnciXv'
    response = requests.get(url)
    soup = bs4.BeautifulSoup(response.text, "html.parser")
    return soup

def get_listings():
    soup = make_soup()
    listings = soup.select('._f21qs6')
    number_of_listings = len(listings)
    print("Current number of listings: " + str(number_of_listings))
    while number_of_listings != 18:
        print("Too few listings: " + str(number_of_listings))
        soup = make_soup()
        listings = soup.select('._f21qs6')
        number_of_listings = len(listings)
    print("All fine! The number of listings is: " + str(number_of_listings))
    return listings

new_listings = get_listings()

# 逐个遍历每个listing标签,调用prettify()打印
for idx, listing in enumerate(new_listings, 1):
    print(f"=== 第{idx}个房源信息 ===")
    print(listing.prettify())
    print("\n" + "-"*80 + "\n")  # 加分隔线区分不同房源

为什么这样可行?

  • soup.select()返回的是ResultSet,里面每个元素都是BeautifulSoup的Tag对象,每个Tag都有自己的prettify()方法,能把自身的HTML结构格式化输出(自动缩进、标签换行)。
  • 直接打印ResultSet时,Python会调用每个Tag的__str__()方法,这个方法返回的是紧凑的无格式HTML,所以会挤在一起。

额外小技巧:批量包装成父标签统一格式化

如果你想一次性把所有房源的格式化HTML打印出来,可以把所有listing标签放到一个父标签里,再对父标签调用prettify():

from bs4 import Tag

# 创建一个空的div父标签
parent_container = Tag(name="div")
for listing in new_listings:
    parent_container.append(listing)

# 打印整个格式化后的HTML
print(parent_container.prettify())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:29