1

在我的软件的某个部分,我想简单地获取 URL 的源代码,然后我想解析那个字符串(源)并做一些事情。问题是,当我实际运行程序时,我无法弄清楚如何获得所说的源,即使它在 IDLE 中工作。

import urllib2

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req = urllib2.Request('http://www.google.com')
response = urllib2.urlopen(req)
page_source = response.read()

page_source

例如,如果我这样做,“page_source”将不会打印任何内容,它只会保持沉默并完成执行。我相信这是因为它不是同步的,但是我不知道如何解决它。我什至尝试过(作为绝望的尝试):

import urllib2
import time

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req = urllib2.Request('http://www.google.com')
response = urllib2.urlopen(req)
page_source = response.read()

time.sleep(4)

page_source

这也行不通。

我已经考虑过获取response.code并制作一个while循环,类似于以下内容:

while (response.code !== 200):
    time.sleep(4)

但话又说回来,它失败了,因为“response.code”根本没有返回任何东西。

我不担心用户连接等问题,因为其余的代码已经处理好了,我真的只需要弄清楚如何获取页面源并解析它。

4

1 回答 1

4

请求确实是同步的。问题只是评估一个表达式并没有实际打印它。如果您想查看必须明确使用的值print

import urllib2

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req = urllib2.Request('http://www.google.com')
response = urllib2.urlopen(req)
page_source = response.read()

print page_source

您可能注意到print在 Python shell 中输入代码时不需要。这是因为 Python shell 解析和执行代码的方式与它作为模块出现时的方式略有不同,检测输入是否解析为独立表达式,如果是则自动打印。执行源文件时,此速记不适用。

如果您对 Python 将字符串解析为源代码的不同方式的详细信息感兴趣,请参阅内置compile函数;请注意,它有一个mode参数可以在三种不同的可能解析模式之间进行选择。Python shell 使用 模式single,而普通的源文件被编译为exec. 最后一种模式,eval,由Python 的内置eval函数使用。

于 2013-03-28T23:58:55.540 回答