如何从JSON文件中删除所有HTML内容?

时间:2015-01-06 14:16:17

标签: python html regex json data-cleaning

我想通过丢弃HTML标记中包含的所有文本(包括标记本身)来清理错误提取的HTML内容的JSON文件。

我试过这个功能:

def stripIt(s):
    txt = re.sub('</?[^<]+?>.*?</[^<]+?>', '', s)
    return re.sub('\s+', ' ', txt)

但是当我将它应用到JSON文件时,它可能会破坏JSON文件,从而产生一些错误。

HTML内容也会因缺少标签,只关闭标签等而中断。

那么如何在不破坏文件的情况下从JSON文件中删除所有HTML内容?

2 个答案:

答案 0 :(得分:4)

  

如何在不破坏json文件的情况下从hson文件中删除html内容?

与任何其他序列化数据结构相同。通过使用适当的解析器(在这种情况下,一个很小的递归函数)。

import json
import re

json_string = """{
  "prop_1": {
    "prop_1_1": ["some <html> data", 17, "more <html> data"],
    "prop_1_2": "here some <html>, too"
  },
  "prop_2": "and more <html>"
}"""

def unhtml(string):
    # replace <tag>...</tag>, possibly more than once
    done = False
    while not done:
        temp = re.sub(r'<([^/]\S*)[^>]*>[\s\S]*?</\1>', '', string)
        done = temp == string
        string = temp
    # replace remaining standalone tags, if any
    string = re.sub(r'<[^>]*>', '', string)
    string = re.sub(r'\s{2,}', ' ', string)
    return string.strip()

def cleanup(element):
    if isinstance(element, list):
        for i, item in enumerate(element):
            element[i] = cleanup(item)
    elif isinstance(element, dict):
        for key in element.keys():
            element[key] = cleanup(element[key])
    elif isinstance(element, basestring):
        element = unhtml(element)

    return element

用作

data = json.loads(json_string)
cleanup(data)
json_string = json.dumps(data)
print json_string

抛弃HTML标记的正则表达式只能解决问题的一半。所有字符实体(如&amp;&lt;都将保留在字符串中。

重写unhtml()以使用proper parser

答案 1 :(得分:0)

我在这里假设您正在尝试从JSON对象值中删除HTML。

加载JSON对象并提取对象值,然后转换为字符串,这可以防止由于Unicode字符转换而引起的任何错误:

import json
import re 

with open('File_Name', encoding="utf8") as jsonFile:    
        data = json.load(jsonFile)
        string = str(*JSON_Object_Value*)

用于从JSON对象的字符串值中删除HTML标记并将其替换为空格字符(“”):

clean = re.compile('<.*?>')
string = re.sub(clean, " ", string)

用于从JSON对象的字符串值中删除任何字符表示形式的十六进制数字,并将其替换为空格字符(“”):

clean = re.compile('&.*?;')
string = re.sub(clean, " ", string)

您也可以用其他任何所需的字符代替空格字符。