【问题标题】:Extracting img src value from json [duplicate]从json中提取img src值[重复]
【发布时间】:2015-04-13 18:08:10
【问题描述】:

我需要帮助从文本中提取 src 值(例如:LOC/IMG.png)。执行此操作的任何最佳方法,因为我的文件数超过 10^5 个文件。

我的 JSON 如下:

{"Items":[{src=\"LOC/IMG.png\"}]}

【问题讨论】:

  • 这是字符串还是字典?
  • Json 输出存储在文件中,文件数超过 10 万。
  • 这不是“HTML 和 JSON 的混合响应”,它只是 JSON,其中一些成员是似乎是某种形式的预处理 HTML 的字符串。解析它的正确方法是解析 JSON,查看您想要查看的字符串,然后将它们解码为 HTML 片段,然后搜索这些片段。
  • 是的,有些参数中包含混合的 HTML 字符串。文件格式是上面提到的json
  • 另外,10 万是多少?是 173.6 总面包师的几十个还是什么?

标签: python regex bash


【解决方案1】:

您的 JSON 包含一些 HTML 值。因此,如果可能的话,您应该将 JSON 解析为 JSON,然后将 HTML 值解析为 HTML。这需要您对数据的结构有一点了解——但无论如何,这都是一件好事。

例如:

j = json.loads(s)
for item in j['Items']:
    soup = bs4.BeautifulSoup(item['Item'])
    for img in soup.find_all('img'):
        yield img['src']

这个可能太慢了,但是只需要几分钟就可以编写正确的代码,在 1000 个随机的代表性文件上运行它,然后确定它在推断到任何情况下是否足够快“文件数为 10 万”。如果它足够快,那么就这样做;在其他条件相同的情况下,正确和简单总是比笨拙或复杂要好,如果意外数据立即显示为错误而不是显示为不正确的结果,您将节省时间一周后通知……

如果您的文件大约为 2K,就像您的示例一样,我的笔记本电脑可以 json.loads 2K 随机 JSON 和 BeautifulSoup 2K 随机 HTML 所用的时间比从硬盘读取 2K 所需的时间更短,所以更糟糕的是只需要读取数据并且什么都不做的时间的两倍。如果您的 CPU 速度较慢,SSD 速度较快,或者您的数据非常不寻常,等等,那可能不是真的(这就是您测试而不是猜测的原因),但我认为您会没事的。

【讨论】:

    【解决方案2】:

    让我为解析器放一个免责声明:我并不声称正则表达式是最酷的,而且我自己尽可能在任何地方使用 XML/JSON 解析器。但是,当涉及到任何格式错误的文本时,解析器通常无法按照我想要的方式处理这些情况。我必须添加正则表达式代码来处理这些情况。

    因此,如果绝对需要正则表达式,请使用 (?<=src=\\").*?(?=\\")" 正则表达式。 (?<=src=\\") 后视和前瞻 (?=\") 将充当 src 属性内的值的边界。

    这里是示例代码:

    import re
    p = re.compile(ur'(?<=src=\\").*?(?=\\")')
    test_str = "YOUR_STRING"
    re.findall(p, test_str)
    

    demo

    【讨论】:

    • 除了parsing HTML with regex 已经很糟糕的事实之外,解析以某种未知方式转义的 HTML 以及嵌入在另一种可能包含您正在寻找的完全相同模式的格式的 HTML 更糟糕。
    猜你喜欢
    • 2013-02-25
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多