如果找到 NoneType/缺失值,如何将 API 数据输入过程继续到 Python 的 DataFrame

How to proceed API Data Input Process to Python's DataFrame if NoneType / missing value is found

我正在尝试从 Goodreads API 访问数据。但是,当迭代输入发现 NoneType 数据时,输入过程停止并且不会按照我的预期进行下一次迭代。

我也能想到;

  1. 跳过 NoneType 数据之后的当前行数据输入的其余部分,然后清除所有包含空数据的行,或者
  2. 直接删除整个当前行时间迭代找到非类型数据。

完整代码如下:

import pandas as pd
import urllib.request, urllib.parse, urllib.error
import xml.etree.ElementTree as ET

columns = ['id',
           'title',
           'authors/author/name',
           'average_rating',
           'isbn',
           'isbn13',
           'language_code',
           'num_pages',
           'ratings_count',
           'text_reviews_count',]
index = list(range(6,7))
table = pd.DataFrame(index=index, columns=columns)


#Here's the mining to DataFrame
for row in index:
    for path in columns:        
        serviceurl1 = 'https://www.goodreads.com/book/show.xml?'
        parameters1 = {'key': 'J9l5JsnPRm..............',
                      'id': row,
                      'format': 'xml',
                      }
        url = serviceurl1 + urllib.parse.urlencode(parameters1)
        access = urllib.request.urlopen(url, context = ctx)
        data = access.read().decode('utf-8')


        #DATA MINING PROCESS
        #parsing the 'data' string into readable xml
        tree = ET.fromstring(data)

        inlst = tree.findall('book/%s' %path)
        instr = []
        for element in inlst:
            instr.append(element.text)
        datum = '-'.join(instr)

        table[path][row] = datum      

print(table)

下面是我希望输入 skipping/deleting 空数据的部分:

for element in inlst:
    instr.append(element.text)
datum = '-'.join(instr)

下面是我要提取数据的XML文件:

<book>
  <id>6</id>
  <title>Harry Potter and the Goblet of Fire (Harry Potter, #4)</title>
  <isbn></isbn>
  <isbn13></isbn13>
</book>

从上面可以看出xml,'isbn'和'isbn13'是空数据,迭代访问它们时程序正在停止。

至于第一个解决方案,我只知道如何删除包含空数据的行,但不知道如何在迭代找到空数据时跳过。对于第二个解决方案,我完全不知道该怎么做。

有什么办法可以实现这个方案或者有什么其他的建议吗?谢谢大家,感谢帮助..

下面是包含检查 NoneType 的条件的片段:

for element in inlst:
    if element.text:
        instr.append(element.text)
datum = '-'.join(instr)

同时发布整个测试代码:

import pandas as pd
import urllib.request, urllib.parse, urllib.error
import xml.etree.ElementTree as ET

columns = ['id',
           'title',
           'authors/author/name',
           'average_rating',
           'isbn',
           'isbn13',
           'language_code',
           'num_pages',
           'ratings_count',
           'text_reviews_count',]
index = list(range(6,7))
table = pd.DataFrame(index=index, columns=columns)


#Here's the mining to DataFrame
for row in index:
    for path in columns:        

        data = '''
        <book>
          <id>6</id>
          <title>Harry Potter and the Goblet of Fire (Harry Potter, #4)</title>
          <isbn>4</isbn>
          <isbn13></isbn13>
        </book>
        '''


        #DATA MINING PROCESS
        #parsing the 'data' string into readable xml
        tree = ET.fromstring(data)

        inlst = tree.findall('%s' %path)
        instr = []
        for element in inlst:
            if element.text:
                instr.append(element.text)
        datum = '-'.join(instr)

        table[path][row] = datum      

print(table)

运行 上面的代码片段并观察输出,我认为它与您所问的情况完全一致。

我还更新了 findall 条件如下:

inlst = tree.findall('%s' %path)