1

I got this error even the json code is correct (I tested it with JSON Validator). Here's my code :

import urllib.request, urllib.parse
import json

num_queries = 50*4 
query = urllib.parse.urlencode({'q' : 'example'})
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query

for start in range(0, num_queries, 4):
    request_url = '{0}&start={1}'.format(url, start)
    print(request_url)
    request = urllib.request.Request(request_url)
    request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')
    search_results = urllib.request.urlopen(request)
    encoding = search_results.headers.get_content_charset()
    print(search_results.read().decode(encoding))
    json = json.loads(search_results.read().decode(encoding))
    results = json['responseData']['results']
    for i in results:
        print (i['url'])

Here's the responses I get :

{
"responseData": {
    "results": [
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://example.com/",
            "url": "http://example.com/",
            "visibleUrl": "example.com",
            "cacheUrl": "http://www.google.com/search?q=cache:OEM9MzUDrRQJ:example.com",
            "title": "<b>Example</b> Domain",
            "titleNoFormatting": "Example Domain",
            "content": "<b>Example</b> Domain. This domain is established to be used for illustrative <b>examples</b> \nin documents. You may use this domain in <b>examples</b> without prior coordination ..."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://fr.wikipedia.org/wiki/Example_(chanteur)",
            "url": "http://fr.wikipedia.org/wiki/Example_(chanteur)",
            "visibleUrl": "fr.wikipedia.org",
            "cacheUrl": "http://www.google.com/search?q=cache:KQgswW_0sBoJ:fr.wikipedia.org",
            "title": "<b>Example</b> (chanteur) — Wikipédia",
            "titleNoFormatting": "Example (chanteur) — Wikipédia",
            "content": "Elliot John Gleave plus connu sous le pseudonyme <b>Example</b> (né le 20 juin 1982) \nest un chanteur et rappeur britannique. Son nom de scène vient de ses ..."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://www.trythisforexample.com/",
            "url": "http://www.trythisforexample.com/",
            "visibleUrl": "www.trythisforexample.com",
            "cacheUrl": "http://www.google.com/search?q=cache:VErXNqtEJDsJ:www.trythisforexample.com",
            "title": "<b>Example</b>",
            "titleNoFormatting": "Example",
            "content": "Official site for <b>Example</b>. ... Pre-order New Album · Tour Dates · Merch · Twitter · \nInstagram · Facebook · Youtube <b>Example</b> © 2013 Epic Records Privacy Policy."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://www.youtube.com/watch?v=CLXt3yh2g0s",
            "url": "http://www.youtube.com/watch%3Fv%3DCLXt3yh2g0s",
            "visibleUrl": "www.youtube.com",
            "cacheUrl": "http://www.google.com/search?q=cache:9CKsisLTCjgJ:www.youtube.com",
            "title": "<b>Example</b> - &#39;Changed The Way You Kiss Me&#39; (Official Video) - YouTube",
            "titleNoFormatting": "Example - &#39;Changed The Way You Kiss Me&#39; (Official Video) - YouTube",
            "content": "Apr 21, 2011 <b>...</b> Download <b>Example&#39;s</b> new single &#39;Perfect Replacement&#39; on iTunes (Out Now): http\n://www.smarturl.it/PERFECTREPLACEMENT For more Click ..."
        }
    ],
    "cursor": {
        "resultCount": "157 000 000",
        "pages": [
            {
                "start": "0",
                "label": 1
            },
            {
                "start": "4",
                "label": 2
            },
            {
                "start": "8",
                "label": 3
            },
            {
                "start": "12",
                "label": 4
            },
            {
                "start": "16",
                "label": 5
            },
            {
                "start": "20",
                "label": 6
            },
            {
                "start": "24",
                "label": 7
            },
            {
                "start": "28",
                "label": 8
            }
        ],
        "estimatedResultCount": "157000000",
        "currentPageIndex": 0,
        "moreResultsUrl": "http://www.google.com/search?oe=utf8&ie=utf8&source=uds&start=0&hl=fr&q=example",
        "searchResultTime": "0,22"
    }
},
"responseDetails": null,
"responseStatus": 200
}

The error :

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    text = json.loads(search_results.read().decode(encoding))
  File "/usr/lib/python3.3/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.3/json/decoder.py", line 352, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.3/json/decoder.py", line 370, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Hunsu
  • 3,281
  • 7
  • 29
  • 64

2 Answers2

2

Calling search_results.read() when you print out the raw json string empties the request buffer.

When you call it again to decode the JSON, the buffer is empty, and you fail to decode the empty string it returns.

Eric
  • 95,302
  • 53
  • 242
  • 374
0

Your JSON is valid, however some strings of it contain newline characters \n. If they are meant to be part of the strings you need to escape them (add a \ before). If they're not meant to be part of the string, you ought to remove them from.

So basically you need to replace all the \n in your JSON with \\n, or remove them.

A similiar issue was answered here.

Community
  • 1
  • 1
Tim
  • 41,901
  • 18
  • 127
  • 145
  • 1
    This is only relevant if the json is inside a python string _literal_. In this case, the op is getting it from the server. – Eric Apr 03 '14 at 13:06