Python urllib.urlopen IOError - PullRequest
       8

Python urllib.urlopen IOError

3 голосов
/ 20 апреля 2010

Итак, у меня есть следующие строки кода в функции

sock = urllib.urlopen(url)
html = sock.read()
sock.close()

и они работают нормально, когда я вызываю функцию вручную. Однако, когда я вызываю функцию в цикле (используя те же URL-адреса, что и ранее), я получаю следующую ошибку:

> Traceback (most recent call last):
  File "./headlines.py", line 256, in <module>
    main(argv[1:])
  File "./headlines.py", line 37, in main
    write_articles(headline, output_folder + "articles_" + term +"/")
  File "./headlines.py", line 232, in write_articles
    print get_blogs(headline, 5)
  File "/Users/michaelnussbaum08/Documents/College/Sophmore_Year/Quarter_2/Innovation/Headlines/_code/get_content.py", line 41, in get_blogs
    sock = urllib.urlopen(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 203, in open
    return getattr(self, name)(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 314, in open_http
    if not host: raise IOError, ('http error', 'no host given')
IOError: [Errno http error] no host given

Есть идеи?

Изменить код:

def get_blogs(term, num_results):
    search_term = term.replace(" ", "+")
    print "search_term: " + search_term
    url = 'http://blogsearch.google.com/blogsearch_feeds?hl=en&q='+search_term+'&ie=utf-8&num=10&output=rss'
    print "url: " +url  

    #error occurs on line below

    sock = urllib.urlopen(url)
    html = sock.read()
    sock.close()

def write_articles(headline, output_folder, num_articles=5):

    #calls get_blogs

    if not os.path.exists(output_folder):
    os.makedirs(output_folder)

    output_file = output_folder+headline.strip("\n")+".txt"
    f = open(output_file, 'a')
    articles = get_articles(headline, num_articles)
    blogs = get_blogs(headline, num_articles)


    #NEW FUNCTION
    #the loop that calls write_articles
    for term in trend_list: 
        if do_find_max == True:
        fill_search_term(term, output_folder)
    headlines = headline_process(term, output_folder, max_headlines, do_find_max)
    for headline in headlines:
    try:
        write_articles(headline, output_folder + "articles_" + term +"/")
    except UnicodeEncodeError:
        pass

Ответы [ 3 ]

6 голосов
/ 28 июня 2013

У меня была эта проблема, когда переменная, которую я объединял с URL, в вашем случае search_term

url = 'http://blogsearch.google.com/blogsearch_feeds?hl=en&q='+search_term+'&ie=utf-8&num=10&output=rss'

в конце был символ новой строки. Поэтому убедитесь, что вы делаете

search_term = search_term.strip()

Вы также можете сделать

search_term = urllib2.quote(search_term)

, чтобы убедиться, что ваша строка безопасна для URL

1 голос
/ 20 апреля 2010

используйте вместо этого urllib2, если вы не хотите самостоятельно обрабатывать чтение для каждого блока. Это, вероятно, делает то, что вы ожидаете.

import urllib2
req = urllib2.Request(url='http://stackoverflow.com/')
f = urllib2.urlopen(req)
print f.read()
1 голос
/ 20 апреля 2010

В цикле вашей функции, прямо перед вызовом urlopen, возможно, поместите оператор print:

print(url)
sock = urllib.urlopen(url)

Таким образом, когда вы запустите скрипт и получите IOError, вы увидите url, который вызывает проблему. Ошибка «хост не указан» может быть воспроизведена, если url равно что-то вроде 'http://' ...

...