【问题标题】:How can I strip all the HTML content from a JSON file?如何从 JSON 文件中剥离所有 HTML 内容?
【发布时间】:2015-03-04 05:33:38
【问题描述】:

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

我试过这个功能:

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

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

HTML 内容也因缺少标签、只有结束标签等而被破坏。

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

【问题讨论】:

  • 我猜你必须在从结构中获取条目时对条目进行清理,而不是一次从整个文件中获取它们
  • 但是正则表达式本身可以完成这项工作吗?
  • 最好的测试方法是在内容的在线正则表达式验证器上使用。不要用反复试验来折磨自己...regexpal.com
  • @Ali 取决于。此表达式将废弃标签,但 HTML 不仅仅是标签。

标签: python html regex json data-cleaning


【解决方案1】:

我在这里假设您正在尝试从 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)

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

【讨论】:

    【解决方案2】:

    如何从 json 文件中剥离 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;amp;&amp;lt; 将保留在字符串中。

    重写unhtml() 也使用proper parser

    【讨论】:

    • 谢谢,我必须用 str 替换 basestring 才能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    • 1970-01-01
    • 2019-09-25
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多