首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从HTML中删除空节点

从HTML中删除空节点
EN

Stack Overflow用户
提问于 2012-02-19 02:09:55
回答 4查看 398关注 0票数 7

我们正在从一个内容系统迁移到另一个内容系统,并且有大量的HTML,其中有行,例如,像这样:

代码语言:javascript
运行
复制
<p style="text-align: justify;"><i> </i></p>

我正在寻找一种用Python剥离HTML的方法,在那里没有文本输出到屏幕。因此,类似于此的行将被剥离。

而且,这只是许多没有文本输出的行中的一个示例。所以,我需要把它们都找出来脱光。我不必担心图像、电影等,因为在我们的旧内容管理系统中只能使用文本。

顺便说一句,绝大多数代码行要么以p标签开头,要么以div标签开头(忽略前导空格)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-19 02:31:05

如果超文本标记语言也是一个格式良好的XML文档(这可以通过像这样的工具在预传递中完成),则执行以下转换:

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[not(normalize-space(.))]"/>
</xsl:stylesheet>

当应用于任何这样的文档时--例如:

代码语言:javascript
运行
复制
<html>
 <body>
   Welcome.
   <p style="text-align: justify;"><i> </i></p>
 </body>
</html>

生成所需的结果,其中任何字符串值为空或全为空格的元素都将被删除。

代码语言:javascript
运行
复制
<html>

   <body>
      Welcome.


   </body>

</html>
票数 3
EN

Stack Overflow用户

发布于 2012-02-19 02:34:30

如果你在Unix机器上,这个python脚本应该可以工作:

代码语言:javascript
运行
复制
#!/usr/bin/python

import sys
import os
import subprocess
import tempfile

if len(sys.argv) < 2:
    sys.exit("usage: %s HTML_FILE" % sys.argv[0])

stylesheet = '''
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="*[string-length(normalize-space(.)) = 0]"/>

      <xsl:template match="@*|node()">
         <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
      </xsl:template>

    </xsl:stylesheet>
'''

stylesheet_file = tempfile.NamedTemporaryFile(suffix='.xslt')
stylesheet_file.write(stylesheet)
stylesheet_file.flush()

p = subprocess.Popen("xsltproc --html %s %s" % (stylesheet_file.name, sys.argv[1]), 
        shell=True, stdout=subprocess.PIPE)

p.wait()
sys.stdout.write(p.stdout.read())
stylesheet_file.close()
票数 2
EN

Stack Overflow用户

发布于 2012-02-19 06:55:55

如果HTML文件不是有效的XHTML,我建议安装beautifulsoup4和lxml包并使用以下脚本,该脚本删除所有没有文本内容的标记,然后从输出中删除空行:

代码语言:javascript
运行
复制
import sys
from bs4 import BeautifulSoup, element
def no_nl(s):
    return str(s).replace("\r", "").replace("\n", "")

if len(sys.argv) != 2:
    print "Usage: %s html_file > output" % sys.argv[0]
    sys.exit(1)

soup = BeautifulSoup(open(sys.argv[1]))

# first we have to get rid of all comments
for e in soup.find_all():
    for x in e.children:
        if isinstance(x, element.Comment):
            x.replace_with("")

for e in soup.find_all():
    if not len(no_nl(e.text).strip()):
        e.extract()

for s in str(soup).split("\n"):
    if len(s.strip()):
        print s

以下HTML:

代码语言:javascript
运行
复制
<html><head><title>Title</title>
</head><body>
<div class="abc"><div> 
<div><div><span> </span>
</div><![CDATA[ This should vanish from output ]]> </div>
</div></div><p class="title"> <!--blah blah blah comment to remove-->
<p class="title"><b>Something</b> here.
</p><p style="text-align: justify;">aaa<I> x</I><span>blah</span></p>
<p style="text-align: justify;"><I> </I><span></span>
<p><i><b>  </b></i></p>
<div style="text-align: justify;"><i> </i></div>
<p class="txt">Spam, spam, lovely spam.
<p>    </p></body></html>

打印为:

代码语言:javascript
运行
复制
<html><head><title>Title</title></head><body>
<p class="title"><b>Something</b> here.
</p><p style="text-align: justify;">aaa<i> x</i><span>blah</span></p>
<p class="txt">Spam, spam, 
lovely spam.</p>
</body></html>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9343768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档