如果找到 NoneType/缺失值,如何将 API 数据输入过程继续到 Python 的 DataFrame
How to proceed API Data Input Process to Python's DataFrame if NoneType / missing value is found
我正在尝试从 Goodreads API 访问数据。但是,当迭代输入发现 NoneType 数据时,输入过程停止并且不会按照我的预期进行下一次迭代。
我也能想到;
- 跳过 NoneType 数据之后的当前行数据输入的其余部分,然后清除所有包含空数据的行,或者
- 直接删除整个当前行时间迭代找到非类型数据。
完整代码如下:
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)
我正在尝试从 Goodreads API 访问数据。但是,当迭代输入发现 NoneType 数据时,输入过程停止并且不会按照我的预期进行下一次迭代。
我也能想到;
- 跳过 NoneType 数据之后的当前行数据输入的其余部分,然后清除所有包含空数据的行,或者
- 直接删除整个当前行时间迭代找到非类型数据。
完整代码如下:
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)