【问题标题】:Why is urllib.urlopen() only working once? - Python为什么 urllib.urlopen() 只工作一次? - Python
【发布时间】:2012-09-21 14:51:33
【问题描述】:

我正在编写一个爬虫来使用urllib 下载静态html 页面。

get_page 函数工作 1 个周期,但是当我尝试循环它时,它不会将内容打开到我输入的下一个 url。

  • 如何让urllib.urlopen不断下载HTML页面?
  • 如果不行,有没有其他的建议下载 我的 python 代码中的网页?

我下面的代码只返回 seed 列表中第一个网站的 html:

import urllib
def get_page(url):
    return urllib.urlopen(url).read().decode('utf8')

seed = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for j in seed:
      print "here"
      print get_page(j)

urllib2 也会出现同样的抓取“一次性”问题:

import urllib2
def get_page(url):
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    return response.read().decode('utf8')

seed = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for j in seed:
      print "here"
      print get_page(j)

没有例外,我在 urllib 中遇到 IOError:

Traceback (most recent call last):
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 91, in <module>
    print get_page(j)
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 4, in get_page
    return urllib.urlopen(url).read().decode('utf8')
  File "/usr/lib/python2.7/urllib.py", line 86, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.7/urllib.py", line 207, in open
    return getattr(self, name)(url)
  File "/usr/lib/python2.7/urllib.py", line 462, in open_file
    return self.open_local_file(url)
  File "/usr/lib/python2.7/urllib.py", line 476, in open_local_file
    raise IOError(e.errno, e.strerror, e.filename)
IOError: [Errno 2] No such file or directory: 'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html'

没有例外,我得到一个带有 urllib2 的 ValueError:

Traceback (most recent call last):
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 95, in <module>
    print get_page(j)
  File "/home/alvas/workspace/SingCorp/sgcrawl.py", line 7, in get_page
    response = urllib2.urlopen(req)
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 392, in open
    protocol = req.get_type()
  File "/usr/lib/python2.7/urllib2.py", line 254, in get_type
    raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: http://www.pmo.gov.sg/content/pmosite/aboutpmo.html

回答:

发生 IOError 和 ValueError 是因为存在某种 Unicode 字节顺序标记 (BOM)。在第二个 URL 中发现了一个不间断空格。感谢您为解决问题提供的所有帮助和建议!

【问题讨论】:

  • 您是否手动检查过这些网站确实不同?
  • 有一点需要注意,你的导入应该在文件的顶部,而不是在 try except 块中。
  • 尝试在异常处理程序中打印一些东西,看看是否有异常。
  • @antti,我尝试在异常处打印一张便条。 urllib.open 在第一次之后就无法正常工作,这就是它遇到 except 的原因。 @hayden,文件顶部的导入很昂贵。尤其是在爬行方面。
  • 这不是一个解决方案,但由于 Python 多年来的发展方式,您应该使用 urllib2.urlopen... 如果您不介意第 3 方模块,则使用 @987654331 @强烈推荐

标签: python web-crawler urllib2 urllib


【解决方案1】:

您的代码在 .read().decode('utf8') 上卡住了。

但您不会看到这一点,因为您只是在吞咽异常。 urllib“不止一次”工作正常。

import urllib

def get_page(url):
    return urllib.urlopen(url).read()

seeds = ['http://www.pmo.gov.sg/content/pmosite/home.html', 
            'http://www.pmo.gov.sg/content/pmosite/aboutpmo.html']    

for seed in seeds:
      print 'here'
      print get_page(seed)

【讨论】:

  • 删除异常后,我仍然收到如上所示的 IOError。
  • 2er0,这是一个问答网站,而不是众包交互式调试器。问一个问题,得到一个答案,转到下一个问题。不要一直编辑你的代码和问题并重新提出不同的问题。
  • 这是同一个问题和问题。我只是让它更具可读性。 =)
  • 哦,我找到问题了!!!不知何故,杰森哈珀是对的。第二个 URL 包含某种 unicode BOM。
【解决方案2】:

你的两个例子对我来说都很好。对于您的确切错误,我能想到的唯一解释是,第二个 URL 字符串包含某种不可打印的字符(可能是 Unicode BOM),这些字符在将代码粘贴到此处时被过滤掉了。尝试将代码从该站点复制回您的文件中,或者从头开始重新键入整个第二个字符串。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2017-05-29
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多