urllib2 错误: 未提供主机

2 投票
2 回答
14220 浏览
提问于 2025-04-17 14:26

编辑:(已解决)当我从文件中读取值时,末尾会多出一个换行符(\n)。这导致我的请求字符串在那个地方被拆分了。我觉得这和我最开始保存值到文件的方式有关。非常感谢。

我有以下代码:

results = 'http://www.myurl.com/'+str(mystring)
print str(results)
request = urllib2.Request(results)
request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
opener = urllib2.build_opener()
text = opener.open(request).read()

这段代码在一个循环中运行。循环执行几次后,str(mystring)的值会改变,结果也会不同。我可以随意循环这个脚本,保持str(mystring)的值不变,但每次我改变str(mystring)的值时,代码在尝试构建打开器时都会报错,说没有提供主机。

opener = urllib2.build_opener()

有人能帮忙吗?

谢谢,

保罗。

编辑:

这里有更多代码.....

import sys
import string
import httplib
import urllib2
import re
import random
import time


def StripTags(text):
    finished = 0
    while not finished:
        finished = 1
        start = text.find("<")
        if start >= 0:
            stop = text[start:].find(">")
            if stop >= 0:
                text = text[:start] + text[start+stop+1:]
                finished = 0
    return text
mystring="test"

d={}

    with open("myfile","r") as f:
        while True:
            page_counter=0
            print str(mystring)

            try:
                while page_counter <20:
                    results = 'http://www.myurl.com/'+str(mystring)
                    print str(results)
                    request = urllib2.Request(results)
                    request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
                    opener = urllib2.build_opener()
                    text = opener.open(request).read()
                    finds = (re.findall('([\w\.\-]+'+mystring+')',StripTags(text)))
                    for find in finds:
                        d[find]=1
                        uniq_emails=d.keys()
                    page_counter = page_counter +1
                    print "found this " +str(finds)"
                    random.seed()
                    n = random.random()
                    i = n * 5
                    print "Pausing script for " + str(i) + " Seconds" + ""
                    time.sleep(i)
                mystring=next(f)
            except IOError:
                print "No result found!"+""

2 个回答

6

我找到了答案,内容如下……

我从一个文件中读取了mystring的值。

在我写这个文件的脚本时,我用“w”打开了文件,而不是“wb”。

文件中的每一行都以换行符“/n”结尾。

当我把mystring添加到请求字符串中时,换行符就在请求字符串的中间产生了一个新的行。[1]

这在我的代码中是看不出来的,因为我为了隐藏我实际使用的URL而修改了代码,发到这里来求助。[2]

我实际的URL看起来像这样……

Myurl.com/mystring/otherstuff/page_counter/morestuff.htm

从文件中读取的“/n”把我的URL切割了,导致urllib出现了问题……

[1] 我使用的是Windows系统。它会在文本文件中添加很多看不见的东西。如果我用“wb”打开文件而不是“w”,内容就会被写入而没有那些看不见的“/n”。

[2] 小朋友们,记得总是发完整的代码。StackOverflow上的好心人无法帮助你,除非他们能看到你在做什么……

非常感谢大家,希望这能在某个时候帮助到某个人。

保罗。

2

在这个循环里,你把结果设置成了一个不是网址的东西:

results = 'myurl+str(mystring)'

其实应该是 results = myurl+str(mystring)

顺便说一下,你用到的很多字符串转换(str())其实没必要:

  • print str(foo):在这种情况下,根本不需要用到str()。Python会自动打印出foo的字符串形式。
  • results = 'http://www.myurl.com/'+str(mystring)。这也是多余的;因为mystring已经是字符串了,所以直接用'http://www.myurl.com/' + mystring就可以了。
  • print "Pausing script for " + str(i) + " Seconds"。在这里,如果没有str()会出错,因为你不能把字符串和整数直接相加。不过,print "foo", 1, "bar"是可以的。print "foo %i bar" % 1print "foo {0} bar".format(1)也可以用(具体可以查看这里)。

撰写回答