urllib2 错误: 未提供主机
编辑:(已解决)当我从文件中读取值时,末尾会多出一个换行符(\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 个回答
我找到了答案,内容如下……
我从一个文件中读取了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上的好心人无法帮助你,除非他们能看到你在做什么……
非常感谢大家,希望这能在某个时候帮助到某个人。
保罗。
在这个循环里,你把结果设置成了一个不是网址的东西:
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" % 1
和print "foo {0} bar".format(1)
也可以用(具体可以查看这里)。