2009-10-28 85 views
3

我有一个文本文件;用作分隔符。问题在于它有一些html文本格式,例如>显然,在这导致问题。 文本文件很大,我没有这些html字符串的列表,也就是有很多不同的例子,例如$amp;。我如何使用python删除它们。 该文件是一个名称,地址,电话号码和几个领域的列表。我要找的crap.html.remove(文本文件)模块使用Python从文本文件中删除html格式“>”csv.reader

+0

它将主要由&,<,>组成。不会只是找到和替换足够?也许你可以创建一个元组列表http://htmlhelp.com/reference/html40/entities/special.html并使用lambda函数来查找替换它的文件。 – Jaskirat 2009-10-28 13:40:31

回答

6

最快的方法可能是使用无证,但到目前为止稳定unescape方法HTMLParser

import HTMLParser 
s= HTMLParser.HTMLParser().unescape(s) 

注意这将必然输出一个Unicode字符串,因此,如果您有任何非ASCII字节有你首先需要s.decode(encoding)

+0

+1不错的快速入侵 – whatnick 2009-10-28 14:22:02

3

看看代码从here

import re, htmlentitydefs 

## 
# Removes HTML or XML character references and entities from a text string. 
# 
# @param text The HTML (or XML) source text. 
# @return The plain text, as a Unicode string, if necessary. 

def unescape(text): 
    def fixup(m): 
     text = m.group(0) 
     if text[:2] == "&#": 
      # character reference 
      try: 
       if text[:3] == "&#x": 
        return unichr(int(text[3:-1], 16)) 
       else: 
        return unichr(int(text[2:-1])) 
      except (ValueError, OverflowError): 
       pass 
     else: 
      # named entity 
      try: 
       text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) 
      except KeyError: 
       pass 
     return text # leave as is 
    return re.sub("&#?\w+;", fixup, text) 

当然,这个只需要HTML实体的照顾。文本中可能还有其他分号与CSV解析器混淆在一起。但我猜你已经知道了...

UPDATE:追加可能的追加OverflowError

+0

我得到一个错误 /用户/ VMD/Dropbox的/营销材料/信息/ formatleaddata.py在removehtml(文本) 40通 41回文本#保留原样 ---> 42返回应用re.sub(” &#?\w+; “,fixup,text) /Library/Frameworks/Python.framework/Versions/5.1.0/lib/python2.5/re.pyc in sub(pattern,repl,string,count) 如果可调用,它是通过匹配对象和必须返回 149替换串中使用 “”” - > 150返回_compile(图案,0).SUB(REPL,串,计数) 152 DEF指SUBn(图案,repl时,串,数= 0): – Vincent 2009-10-28 16:37:23

+0

这是一个相当拗口,这是我不太清楚是什么错误你有一个电子。 xception类型?也许你应该尝试在一个单独的答案可以发布您的异常细节,只是让我们能有正确的格式。 – itsadok 2009-10-29 07:57:27

1

在大多数Unix系统(包括在Mac OS X),你可以重新编码和输入文本文件:

recode html.. file_with_html.txt 

这将替换& GT;通过“>”等。

例如,您可以通过Python的子流程模块调用它。