Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 请求中的handle ValueError之后是否没有值?_Python_Json_Python 3.x_Pandas_Python Requests - Fatal编程技术网

Python 请求中的handle ValueError之后是否没有值?

Python 请求中的handle ValueError之后是否没有值?,python,json,python-3.x,pandas,python-requests,Python,Json,Python 3.x,Pandas,Python Requests,我向API提出以下请求: def pos(text): payload = {'key': 'thekey', 'of': 'json', 'ilang': 'ES', \ 'txt': text, \ 'tt': 'a', \ 'uw': 'y', 'lang': 'es'} r = requests.get('http://api.meaningcloud.com/parser-2.0

我向API提出以下请求:

def pos(text):
    payload = {'key': 'thekey', 'of': 'json', 'ilang': 'ES', \
               'txt': text, \
               'tt': 'a', \
               'uw': 'y', 'lang': 'es'}

    r = requests.get('http://api.meaningcloud.com/parser-2.0', params=payload, stream = True)
    return r.json()
开始时,它给了我一个
ValueError

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-19-ac09c6405340> in <module>()
      1 
----> 2 df['tags'] = df['tweets'].apply(transform)
      3 df

/usr/local/lib/python3.5/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2292             else:
   2293                 values = self.asobject
-> 2294                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   2295 
   2296         if len(mapped) and isinstance(mapped[0], Series):

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:66124)()

<ipython-input-18-707ac7b399b4> in transform(a_lis)
     25 
     26 def transform(a_lis):
---> 27     analysis = pos(str(a_lis))
     28     a_list = parse_tree(analysis['token_list'], [])
     29     return a_list

<ipython-input-18-707ac7b399b4> in pos(text)
      8 
      9     r = requests.get('http://api.meaningcloud.com/parser-2.0', params=payload, stream = True)
---> 10     return r.json()
     11 
     12 def parse_tree(token, a_list):

/usr/local/lib/python3.5/site-packages/requests/models.py in json(self, **kwargs)
    864                     # used.
    865                     pass
--> 866         return complexjson.loads(self.text, **kwargs)
    867 
    868     @property

/usr/local/lib/python3.5/site-packages/simplejson/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, use_decimal, **kw)
    514             parse_constant is None and object_pairs_hook is None
    515             and not use_decimal and not kw):
--> 516         return _default_decoder.decode(s)
    517     if cls is None:
    518         cls = JSONDecoder

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in decode(self, s, _w, _PY3)
    368         if _PY3 and isinstance(s, binary_type):
    369             s = s.decode(self.encoding)
--> 370         obj, end = self.raw_decode(s)
    371         end = _w(s, end).end()
    372         if end != len(s):

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in raw_decode(self, s, idx, _w, _PY3)
    398             elif ord0 == 0xef and s[idx:idx + 3] == '\xef\xbb\xbf':
    399                 idx += 3
--> 400         return self.scan_once(s, idx=_w(s, idx).end())

JSONDecodeError: Expecting value: line 1 column 1 (char 0)
>>> r  = requests.get('http://api.meaningcloud.com/parser-2.0', params=payload)
>>> r.status_code
414
>>> r.reason
'Request-URI Too Long'
>>> r = requests.post('http://api.meaningcloud.com/parser-2.0', data=payload)
>>> r.status_code
200
但是,对于某些实例(列),我得到了

text                                                tagged_text
Siento que estoy en un cuarto oscuro y hay sil...   [(sentar, VI-S1PSABL-N4), (que, CSSN9), (estar...
Los mejores de @UEoficial Sebastián Jaime, Sey...    None
#ColoColoJuegaEnEl13 la primera y adentro mier...    None
Juguito heladoooo de melón: me siento se...          None
@sxfiacrespo @lunasoledadhern Hola Luna...          [(@sxfiacrespo @lunasoledadhern, NPUU-N-), (ho...

因此,我的问题是,为什么在某些文本(列)中我会得到
None
,如何正确标记这些
None
实例?。注意,我做了一些测试,文本没有问题,因为对于那些
None
json,返回了包含所有标记内容的json。对于。

这几乎不起任何作用:

except ValueError:
    np.nan
它只引用
np.nan
对象。如果要返回它,则需要显式返回:

except ValueError:
    return np.nan
否则函数就只是。。结束,这意味着返回
None

其他说明:

r = requests.get('http://api.meaningcloud.com/parser-2.0', data=payload, stream = True)
json_data = json.dumps(r.json())
data = yaml.load(json_data)
return data
这是一种非常昂贵的拼写方法

r = requests.post('http://api.meaningcloud.com/parser-2.0', data=payload)
return r.json()
将JSON加载到Python中,然后再次生成JSON,然后使用YAML解析器将JSON转换回Python有些过分。我还删除了
stream=True
;只有当您希望将响应数据作为流进行处理时(而
response.json()
方法不这样做),才需要这样做

根据这个例子,
txt
应该是一个字符串。我不会用
str(a_lis)
来产生这个字符串;如果您有一个字符串列表,只需使用
''将它们连接成一个长字符串。join(a_lis)
。但是,我确信
pandas.Series.apply()
会将单个值(例如字符串)传递给函数,此时根本不需要连接任何内容(但在这种情况下,变量名非常混乱)

该API还指定它使用POST请求(我很惊讶它们接受GET still)。使用
POST
请求(
requests.POST()
)将允许您发送更大的文本片段进行分析。使用
数据
关键字。我在上面的最后一个示例中使用了正确的语法

使用GET也是您获得
ValueError
的原因:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-19-ac09c6405340> in <module>()
      1 
----> 2 df['tags'] = df['tweets'].apply(transform)
      3 df

/usr/local/lib/python3.5/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2292             else:
   2293                 values = self.asobject
-> 2294                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   2295 
   2296         if len(mapped) and isinstance(mapped[0], Series):

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:66124)()

<ipython-input-18-707ac7b399b4> in transform(a_lis)
     25 
     26 def transform(a_lis):
---> 27     analysis = pos(str(a_lis))
     28     a_list = parse_tree(analysis['token_list'], [])
     29     return a_list

<ipython-input-18-707ac7b399b4> in pos(text)
      8 
      9     r = requests.get('http://api.meaningcloud.com/parser-2.0', params=payload, stream = True)
---> 10     return r.json()
     11 
     12 def parse_tree(token, a_list):

/usr/local/lib/python3.5/site-packages/requests/models.py in json(self, **kwargs)
    864                     # used.
    865                     pass
--> 866         return complexjson.loads(self.text, **kwargs)
    867 
    868     @property

/usr/local/lib/python3.5/site-packages/simplejson/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, use_decimal, **kw)
    514             parse_constant is None and object_pairs_hook is None
    515             and not use_decimal and not kw):
--> 516         return _default_decoder.decode(s)
    517     if cls is None:
    518         cls = JSONDecoder

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in decode(self, s, _w, _PY3)
    368         if _PY3 and isinstance(s, binary_type):
    369             s = s.decode(self.encoding)
--> 370         obj, end = self.raw_decode(s)
    371         end = _w(s, end).end()
    372         if end != len(s):

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in raw_decode(self, s, idx, _w, _PY3)
    398             elif ord0 == 0xef and s[idx:idx + 3] == '\xef\xbb\xbf':
    399                 idx += 3
--> 400         return self.scan_once(s, idx=_w(s, idx).end())

JSONDecodeError: Expecting value: line 1 column 1 (char 0)
>>> r  = requests.get('http://api.meaningcloud.com/parser-2.0', params=payload)
>>> r.status_code
414
>>> r.reason
'Request-URI Too Long'
>>> r = requests.post('http://api.meaningcloud.com/parser-2.0', data=payload)
>>> r.status_code
200

听起来像是你做了
r.json[]
(方括号)。不,方法对象确实是不可下标的,但它是可调用的。确保使用
()
(圆括号)!请不要将我的答案中的更改编辑到您的问题中;这使我的答案无效,并使未来的访问者对发生的事情感到困惑。@J.Do:我无法帮助您处理
ValueError
,除非您能提供一个复制该错误的样本数据集(使其变小)。@J.Do:这不是一个真正的小样本数据集;我希望得到
api_call()
的返回值,并将其简化为一个最小的示例,
parse_tree()
返回
np.nan
@J.Do:看起来
ValueError
来自您对请求的使用,因为我不能用我的代码复制它。@J.Do:你可以删除
try:…除了:
,并在你的帖子中包含它产生的完整回溯,所以我可以确认…@J.Do:是的,那是因为你使用的是GET,而不是post。服务器给您一个414请求URI过长的错误,这就是为什么我强烈建议您使用POST请求(不受URL长度限制)。