httplib.InvalidURL: 非数字端口

15

我正在尝试编写一个脚本,用于检查许多URL是否存在:

import httplib

with open('urls.txt') as urls:
    for url in urls:
        connection = httplib.HTTPConnection(url)
        connection.request("GET")
        response = connection.getresponse()
        if response.status == 200:
            print '[{}]: '.format(url), "Up!"

但我遇到了这个错误:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    connection = httplib.HTTPConnection(url)
  File "/usr/lib/python2.7/httplib.py", line 693, in __init__
    self._set_hostport(host, port)
  File "/usr/lib/python2.7/httplib.py", line 721, in _set_hostport
    raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
httplib.InvalidURL: nonnumeric port: '//globo.com/galeria/amazonas/a.html

出了什么问题?


你的 urls.txt 文件是什么格式的? - tom
具有"http:"和"https:" URL。 - user1985563
3个回答

32

这可能是一个简单的解决方案,在这里

connection = httplib.HTTPConnection(url)

您正在使用httpconnection,因此无需像http://OSMQuote.com那样提供URL,而是需要提供OSMQuote.com

简而言之,请从您的URL中删除http://https://,因为httplib:视为端口号,端口号必须为数字。

希望这可以帮助到您!


9

httplib.HttpConnection的构造函数中只包含hostport远程URL的信息,而不是整个URL。

对于你的用例,更容易使用urllib2.urlopen

import urllib2

with open('urls.txt') as urls:
    for url in urls:
        try:
            r = urllib2.urlopen(url)
        except urllib2.URLError as e:
            r = e
        if r.code in (200, 401):
            print '[{}]: '.format(url), "Up!"
        elif r.code == 404:
            print '[{}]: '.format(url), "Not Found!" 

哎呀!有几个网址出现了“HTTP错误401:未授权”,脚本就停止了,怎么办? - user1985563
请参见编辑:urlopen在非“成功”响应上会引发URLError,但是URLError也包含HTTP状态代码,因此我们可以执行上述操作。 - tom
该死,现在返回:“ NameError:name'URLError'未定义”,但一切都好“-”。 - user1985563
嗯!还有一个问题:我放置了以下代码:if r.code == 200 or 401: print '[{}]: '.format(url), "Up!" else r.code == 404: print '[{}]: '.format(url), "Not Found!"但是我得到了错误提示:IndentationError: unexpected indent。这是怎么回事? - user1985563
这个 if r.code == 200 or 401: 不是你进行多重相等检查的正确方式。你应该这样写:if r.code in (200, 401): - tom
你需要使用elif而不是else,因为你想要指定一个额外的布尔条件。请参见编辑。 - tom

2

是的..我认为该库只是想从其他参数中获取方案(http/https)并将它们连接在一起;因此,如果您在URL中有http,则库会得到http://http://xxx并出现解析错误。 - WesternGun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接