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

How can I strip all the HTML content from a JSON file?

我想清除 JSON 文件中错误提取的 HTML 内容,方法是丢弃包含在 HTML 标签中的所有文本,包括标签本身。

我试过这个功能:

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

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

HTML 内容也因缺少标签、仅关闭标签等而损坏。

那么如何从 JSON 文件中删除所有 HTML 内容而不破坏文件?

How do I strip the html content out from a json file without breaking it?

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

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]*?</>', '', 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

我在这里假设您正在尝试从 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 标记并用 space 字符 (" ") 替换它们:

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

用于从 JSON 对象的字符串值中去除任何字符表示的十六进制数,并用 space 字符 (" ") 替换它们:

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

除了 space 字符,您也可以将它们替换为任何其他所需的字符。