如何在Python中格式化HTML并将<tr>子元素保持在一行?
解决HTML美化打印并保持子元素同行的问题
默认的BeautifulSoup.prettify()会将所有标签都换行缩进,导致<tr>下的每个<td>都单独占一行,不符合需求。可以通过先整体美化再针对性调整,或者预处理<tr>标签后再美化的方式解决。
方法一:美化后字符串替换
这种方式简单直接,先利用prettify()完成整体格式化,再通过字符串替换去掉<tr>内部<td>的换行和多余缩进:
from bs4 import BeautifulSoup html = '''<html><body><h1>hello world</h1><table><tr><td>1 STRING</td><td>2 STRING</td><td>3 STRING</td></tr></table></body></html>''' soup = BeautifulSoup(html, 'html.parser') # 生成基础美化后的HTML prettified_html = soup.prettify() # 替换<tr>内部的换行和缩进,将<td>内容合并到同一行 adjusted_html = prettified_html.replace(' <td>', '<td>').replace('</td>\n ', '</td>') print(adjusted_html)
方法二:预处理标签后再美化
先解析HTML,将每个<tr>的子元素内容拼接成一行,再执行美化:
from bs4 import BeautifulSoup html = '''<html><body><h1>hello world</h1><table><tr><td>1 STRING</td><td>2 STRING</td><td>3 STRING</td></tr></table></body></html>''' soup = BeautifulSoup(html, 'html.parser') # 遍历所有<tr>标签 for tr in soup.find_all('tr'): # 保存<tr>的所有子元素的HTML字符串 children_html = ''.join(str(child) for child in tr.children) # 清空<tr>原内容,重新添加拼接后的内容 tr.clear() tr.append(BeautifulSoup(children_html, 'html.parser')) # 此时再prettify,<tr>内部的<td>会保持在同一行 print(soup.prettify())
最终输出效果
两种方法都能得到符合预期的格式化结果:
<html> <body> <h1> hello world </h1> <table> <tr> <td>1 STRING</td><td>2 STRING</td><td>3 STRING</td> </tr> </table> </body> </html>
内容的提问来源于stack exchange,提问作者Ayush J.
相关产品推荐
相关产品推荐

