解析数据的最佳方法

时间:2016-03-09 22:34:21

标签: python json web-scraping scrapy

我设法通过scrapy抓取大量数据,所有数据当前都存储为MongoDB中的JSON对象。我主要想知道如何有效地解析和理解数据。我想将数据提取到子部分。例如,假装我将数据存储为:

{
  "data": "category 1: test test \n category2: test test \n test test \n category 3: test test test \n category 4: this is data in category 4 "
}

基本上我想通过关键字来提取关键字之后的所有内容,直到下一个关键字。第1类(“测试测试”)之后的所有信息都应存储在“类别1”下。类别顺序没有真正的押韵或节奏,也没有每个类别后的文本数量,但所有类别都在那里。

我想知道是否有任何库可以用来编写脚本来执行此操作或任何可以自动执行此操作的工具。要么是指向资源的指针,要么我可以学习如何做这样的事情。

2 个答案:

答案 0 :(得分:0)

我会创建一个关键字列表,然后在 data 中查找这些关键字的索引(如果存在)。 (我重新排列了关键字出现在数据中的顺序,以证明以后的观点)。

d = {"data": "category 1: test test \n category 3: test test test \n category2: test test \n test test \n category 4: this is data in category 4 " }
keywords = ['category 1', 'category2', 'category 3', 'category 4']
kw_indices = [-1]*len(keywords)
data = d['data']

for i in range(len(keywords)):
    kw = keywords[i]
    if kw in data:
        kw_indices[i] = data.index(kw)

kw_indices_sorted = sorted(kw_indices)

数据中找到的每个关键字的起始位置由 kw_indices 中的值给出,其中-1表示在数据中找不到该关键字< / em>的。

要查找每个关键字的结束索引,我们会从 kw_indices_sorted 列表中找到下一个起始索引,然后确定哪个关键字具有该起始索引,然后获取该下一个起始索引的值。 / p>

data_by_category = {}
for j in range(len(keywords)):
    kw = keywords[j]

    if kw_indices[j] > -1:
        # The keyword was found in the data and we know where in the string it starts
        kw_start = kw_indices[j]
        sorted_index = kw_indices_sorted.index(kw_start)
        if sorted_index < len(kw_indices_sorted) - 1:
            # This index is not the last/largest value in the list of sorted indices
            # so there will be a next value.
            next_kw_start = kw_indices[kw_indices.index(kw_indices_sorted[sorted_index + 1])]
            kw_data = data[kw_start:next_kw_start]
        else:
            kw_data = data[kw_start:]

        # If you don't want the keyword included in the result you can strip it out here
        kw_data = kw_data.replace(kw + ':', '')
        data_by_category[kw] = kw_data
    else:
        # The keyword was not found in the data, enter an empty value for it or handle this 
        # however else you want.
        data_by_category[kw] = ''

print(data_by_category)

{&#39;类别1&#39;:&#39;测试测试\ n&#39;,&#39; category2&#39;:&#39;测试测试\ n测试测试\ n&#39;,&#39;类别3&#39;:&#39;测试测试测试\ n&#39;,&#39;类别4&#39;:&#39;这是类别4&#39;}

中的数据

答案 1 :(得分:-2)

这听起来像是一项特定的任务,你可能不得不再做一次数据处理。 pymongo是我在python中与Mongo数据库中的数据进行交互的首选库(这也是mongodb本身推荐的)。

要解析字符串本身,请阅读正则表达式,特别是.findall方法:

>>> import re
>>> data_string = "category 1: test test \n category2: test test \n test test \n category 3: test test test \n category 4: this is data in category 4 "
>>> m = re.findall(r'(category\s*\d+): (.*)', data_string)
>>> m
[('category 1', 'test test '), ('category2', 'test test '), ('category 3', 'test test test '), ('category 4', 'this is data in category 4 ')]