如何在 python 中漂亮地格式化 HTML,同时将 <tr> 子级 </tr> 保留在 1 行中?

问题描述 投票:0回答:1

我想漂亮地打印 HTML,同时将

<tr> children </tr>
保留在 1 行中。 HTML STRING 看起来像
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>'''

我尝试用 bs4 的 prettify 解决问题,但没有给出正确的结果。

from bs4 import BeautifulSoup

# Original HTML string
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>'''
</tr></table></body></html>'''

soup = BeautifulSoup(html, 'html.parser')

prettified_html = soup.prettify()

for tr in soup.find_all('tr'):
    
    inline_tr = f"<tr>{''.join(str(td) for td in tr.find_all('td'))}</tr>"
    
    prettified_html = prettified_html.replace(str(tr), inline_tr)


print(prettified_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>

想要的输出:

<!-- HTML-->
<tr><td>1 STRING</td><td>2 STRING</td><td>3 STRING</td></tr>
<!--HTML-->

我愿意使用任何 python 包来解决问题。

python-3.x beautifulsoup pretty-print
1个回答
0
投票

只需使用正则表达式删除

<tr>
</tr>
标签之间的 '/n'

from bs4 import BeautifulSoup
import re

# Original HTML string
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>
</tr></table></body></html>'''

soup = BeautifulSoup(html, 'html.parser')

prettified_html = soup.prettify()

def remove_newlines_in_tr(match):
    tr_content = match.group(0)

    lines = tr_content.split('\n')
    lines = [line.strip() for line in lines]
    tr_content = ''.join(lines)
    return tr_content

pattern = re.compile(r'<tr>.*?</tr>', re.DOTALL)

html_inline_tr = pattern.sub(remove_newlines_in_tr, prettified_html)

print(html_inline_tr)
© www.soinside.com 2019 - 2024. All rights reserved.