2012-02-18 49 views
7

Chúng tôi đang chuyển từ một hệ thống nội dung vào nhau và có tấn HTML nơi có dòng, ví dụ, như thế này:Loại bỏ các nút rỗng từ HTML

<p style="text-align: justify;"><i> </i></p> 

Tôi đang tìm kiếm một cách để tước HTML với Python nơi không có đầu ra văn bản cho màn hình. Vì vậy, một dòng tương tự như thế này sẽ bị tước bỏ.

Và, đây chỉ là một trong số MANY ví dụ về các dòng không có đầu ra văn bản. Vì vậy, tôi sẽ cần phải tìm tất cả chúng để dải. Tôi không phải lo lắng về hình ảnh, phim, v.v. vì chỉ có văn bản có thể có trong hệ thống quản lý nội dung cũ của chúng tôi.

BTW, phần lớn các dòng hoặc bắt đầu bằng thẻ p hoặc thẻ div (bỏ qua khoảng trắng hàng đầu).

+0

Hmm. Điều gì về các thẻ cấu trúc rỗng? (divs để sử dụng bởi JavaScript, ví dụ:) – Cameron

+0

Tôi nghĩ bạn sẽ cần một trình phân tích cú pháp html cho ... – greg0ire

Trả lời

3

Trong trường hợp mã HTML cũng là một tài liệu XML cũng như hình thành (Điều này có thể được thực hiện trong một pre-pass với một công cụ như HTML-Tidy), chuyển đổi này:

<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> 

khi áp dụng trên bất kỳ ví dụ tài liệu XML - ví dụ:

<html> 
<body> 
    Welcome. 
    <p style="text-align: justify;"><i> </i></p> 
</body> 
</html> 

tạo ra kết quả mong muốn, trong đó bất kỳ yếu tố có giá trị chuỗi rỗng hoặc là tất cả các khoảng trắng, bị xóa:

<html> 

    <body> 
     Welcome. 


    </body> 

</html> 
1

Nếu bạn đang ở trên một máy Unix, kịch bản python này nên làm việc:

#!/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() 
1

Trong trường hợp các tập tin HTML là không hợp lệ XHTML, tôi đề nghị cài đặt các gói beautifulsoup4 và lxml và sử dụng tập lệnh sau, loại bỏ tất cả các thẻ không có nội dung văn bản và sau đó ném đi các dòng trống từ đầu ra:

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:

<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> 

được in như:

<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> 
0
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

</xsl:stylesheet> 
Các vấn đề liên quan