Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 美化小组:不要在重要的地方添加空格,在不重要的地方删除';T_Python_Html_Beautifulsoup - Fatal编程技术网

Python 美化小组:不要在重要的地方添加空格,在不重要的地方删除';T

Python 美化小组:不要在重要的地方添加空格,在不重要的地方删除';T,python,html,beautifulsoup,Python,Html,Beautifulsoup,此示例python程序: document='''<p>This is <i>something</i>, it happens in <b>real</b> life</p>''' from bs4 import BeautifulSoup soup = BeautifulSoup(document) print(soup.prettify()) 使用BeautifulSoup是否可以实现这

此示例python程序:

document='''<p>This is <i>something</i>, it happens
               in <b>real</b> life</p>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(document)
print(soup.prettify())

使用
BeautifulSoup
是否可以实现这一点?任何其他推荐的HTML解析器都可以处理这个问题吗?

Beauty Soup的
.prettify()
方法定义为在自己的行上输出每个标记()。如果您想要其他东西,您需要通过遍历解析树来自己制作。

正如前面的评论和Bjorn所述,BeautifulSoup对pretty html的定义是在它自己的行上使用每个标记,但是,为了解决一些与的间距有关的问题,您可以先像这样折叠它:

from bs4 import BeautifulSoup

document = """<p>This is <i>something</i>, it happens
               in <b>real</b> life</p>"""

document_stripped = " ".join(l.strip() for l in document.split("\n"))

soup = BeautifulSoup(document_stripped).prettify()

print(soup)
从bs4导入美化组
document=“”这是一件事,它发生了
在现实生活中
document_.join(document.split(“\n”)中l的l.strip())
汤=美化汤(去除文件)。美化()
印花(汤)
哪个输出:

<html>
 <body>
  <p>
   This is
   <i>
    something
   </i>
   , it happens in
   <b>
    real
   </b>
   life
  </p>
 </body>
</html>


这是
某物
,它发生在
真实的
生活


因为有
的习惯。美化
将每个标签放在自己的行中,不适合生产代码;它仅用于调试输出,IMO。只需使用
str
内置函数将您的soup转换为字符串即可

您想要的是更改树中的字符串内容;您可以创建一个函数来查找包含两个或更多空格字符序列的所有元素(使用预编译的正则表达式),然后替换它们的内容

顺便说一句,如果您这样编写示例,您可以让Python避免插入不重要的空格:

document = ('<p>This is <i>something</i>, it happens '
            'in <b>real</b> life</p>')
document=(“这是一件事,它发生了”
“在现实生活中

”)

这样,您就有了两个隐式关联的文本。

这很大程度上取决于呈现时与相关CSS选择器关联的空白和显示属性。此外,JavaScript很可能被用来修改上述属性。做这件事没有好办法。(我记得这是几年前提出来的)BeautifulSoup的文档声明所有标签都将在自己的行中。但是,重写该方法应该不会太困难-
<html>
 <body>
  <p>
   This is
   <i>
    something
   </i>
   , it happens in
   <b>
    real
   </b>
   life
  </p>
 </body>
</html>
document = ('<p>This is <i>something</i>, it happens '
            'in <b>real</b> life</p>')