Python如何删除html中的空行

时间:2016-12-21 13:29:10

标签: python html beautifulsoup bs4

我有一些问题。 我从html中删除了一些标签。但我希望输出没有空行。喜欢这个。

<!DOCTYPE html>
<html itemscope="itemscope" itemtype="http://schema.org/WebPage" lang="id-ID">
<head>
<title>Kenya Kasat Narkoba Polres Bintan Diganti? Ini Pesan Kapolres melada Kasatreskrim Baru - Tribun Batam</title>

</head>
<body id="bodyart">
<div id="skinads" style="position:fixed;width:100%;">
<div class="main">
<div class="f1" style="height:600px;width:90px;left:-97px:position:relative;text-align:right;z-index:999999">
<div id="div-Left-Skin" style="width:90px; height:600px;display:none">

</div>
</div>
<div class="fr" style="height:600px;width;90px;right:-97px;position:relative;text-align:left;z-index:999999">
<div id="div-Right-Skin" style="width:90px; height:600px;display:none">

</div>
</div>
</div>
<div class="cl2"></div>
</div>
<div id="fb-root"></div>

我的预期输出是

<!DOCTYPE html>
<html itemscope="itemscope" itemtype="http://schema.org/WebPage" lang="id-ID">
<head>
<title>Kenya Kasat Narkoba Polres Bintan Diganti? Ini Pesan Kapolres melada Kasatreskrim Baru - Tribun Batam</title>
</head>
<body id="bodyart">
<div id="skinads" style="position:fixed;width:100%;">
<div class="main">
<div class="f1" style="height:600px;width:90px;left:-97px:position:relative;text-align:right;z-index:999999">
<div id="div-Left-Skin" style="width:90px; height:600px;display:none">
</div>
</div>
<div class="fr" style="height:600px;width;90px;right:-97px;position:relative;text-align:left;z-index:999999">
<div id="div-Right-Skin" style="width:90px; height:600px;display:none">
</div>
</div>
</div>
<div class="cl2"></div>
</div>
<div id="fb-root"></div>

如何删除html中的空行?我可以用beautifulsoup吗?还是任何图书馆?

更新

我尝试将我的代码与@elethan的anwer结合起来,但我收到了一些错误

我的代码是

from list import get_filepaths
from bs4 import BeautifulSoup
from bs4 import Comment


filenames = get_filepaths(r"C:\Coba")
index = 0
for f in filenames:
    file_html=open(str(f),"r")
    soup = BeautifulSoup(file_html,"html.parser")
    [x.extract() for x in soup.find_all('script')]
    [x.extract() for x in soup.find_all('style')]
    [x.extract() for x in soup.find_all('meta')]
    [x.extract() for x in soup.find_all('noscript')]
    [x.extract() for x in soup.find_all(text=lambda text:isinstance(text, Comment))]

    index += 1
    stored_file = "PreProcessing\extracts" + '{0:03}'.format(index) + ".html"
    filewrite = open(stored_file, "w")
    filewrite.write(str(soup) + '\n')
    with open(stored_file, 'r+') as f:
        lines = [i for i in f.readlines() if i and i != '\n']
        f.seek(0)
        f.writelines(lines)
        f.truncate()
    filewrite.close

但是我得到了这样的输出(抱歉不能粘贴html) 实际上它在开始时非常好,但几乎在那里结束了nul nul nul(就像屏幕截图)。

如何删除nul nul nul? enter image description here

2 个答案:

答案 0 :(得分:0)

在您的代码中,首先从文件中删除所有额外的换行符:

with open(my_html_file) as f:
    lines = [i for i in f.readlines() if i and i != '\n']

然后将过滤后的文本写回文件:

with open(my_html_file, 'w') as f:
    f.writelines(lines)

或者在一个with块中执行整个操作:

with open(my_html_file, 'r+') as f:
    lines = [i for i in f.readlines() if i and i != '\n']
    f.seek(0)
    f.writelines(lines)
    f.truncate()

根据您现有的代码(您应该将其添加到问题中),您可以简单地将代码的过滤部分添加到您拥有的代码中。

答案 1 :(得分:0)

是的,你可以使用Beautifulsoup,它非常简单。

BS4将尝试修复损坏的html标记,如最后一行</body></html>并删除空白区域。不同解析器的结果会略有不同,'lxml'解析器表现良好。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')
print(str(soup))

出:

<!DOCTYPE html>
<html itemscope="itemscope" itemtype="http://schema.org/WebPage" lang="id-ID">
<head>
<title>Kenya Kasat Narkoba Polres Bintan Diganti? Ini Pesan Kapolres melada Kasatreskrim Baru - Tribun Batam</title>
</head>
<body id="bodyart">
<div id="skinads" style="position:fixed;width:100%;">
<div class="main">
<div class="f1" style="height:600px;width:90px;left:-97px:position:relative;text-align:right;z-index:999999">
<div id="div-Left-Skin" style="width:90px; height:600px;display:none">
</div>
</div>
<div class="fr" style="height:600px;width;90px;right:-97px;position:relative;text-align:left;z-index:999999">
<div id="div-Right-Skin" style="width:90px; height:600px;display:none">
</div>
</div>
</div>
<div class="cl2"></div>
</div>
<div id="fb-root"></div>
</body></html>