我正在尝试从Goodreads API访问数据。但是,当迭代输入找到 NoneType 数据时,输入进程将停止,并且不会按我的预期进行下一次迭代。
我能想到任何一个;
- 跳过 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)
以下是我希望跳过/删除空数据输入的部分:
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"是空数据,当迭代访问它们时,程序正在停止。
至于第一个解决方案,我只知道如何删除包含空数据的行,但 idk 如何在迭代找到空数据时跳过。对于第二个解决方案 idk 到底该怎么做。
有没有办法实施此解决方案或有任何其他建议?谢谢大家,感谢您的帮助。
下面是包含检查 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)
运行上面的代码片段并观察输出,我认为它与您询问的情况完全一致。
此外,我还更新了查找条件,如下所示:
inlst = tree.findall('%s' %path)