如何格式化打印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
相关产品推荐
相关产品推荐

