2012-09-17 40 views
12

我试图获取以下网页:为什么urllib.urlopen.read()与源代码不符?

import urllib 
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read() 

结果不符合我所看到的检查使用谷歌浏览器,例如网页的源代码时。

你能告诉我为什么会发生这种情况,以及如何改进我的代码来克服这个问题?

谢谢你的帮助。

+1

中看到它们有什么区别? –

+0

你好,urllib.urlopen.read()给我例如在正文:' \ n

\ n'这是关于什么在页面上的信息太小。 –

+0

请看斯里卡的答案。该页面是使用JavaScript动态生成的。关键是在“Album1.EcritElement(0)”。 –

回答

10

你从urlopen得到的是没有执行javascript的原始网页含义css没有被使用;从Chrome(或其他浏览器)获得的最终网页包括可执行的javascript(可能会改变HTML),css渲染等,所有这些都不会发生在urlopen ...

因此,希望这是明确的

+0

当操纵DOM时,Chrome的* source *视图是否会更改? Firefox一个没有。 – delnan

+2

@delnan OP没有明确地说他正在使用View Source(它不会改变),而不是Inspect Element(它会)。 –

+0

@SrikarThanks我应该用什么来代替urlopen来解析最终的网页呢? –

3

此外,一些网站有一个所谓的浏览器切换,可能会导致不同的来源显示时,使用不同的浏览器(例如显示移动浏览器的轻版本)。如何将用户代理更改为诸如“Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.1(KHTML,如Gecko)Chrome/21.0.1180.89 Safari/537.1”(其中这实际上是我的用户代理)。

9

你可以使用python Selenium来解决你的问题。这里有一个示例代码看看。

from selenium import webdriverr 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
browser = webdriver.Firefox() 
browser.get(url) 
sleep(10) 
all_body_id_html = browser.find_element_by_id('body') # you can also get all html 

然后由于根据您的选择 一些例如与浏览器实例你的工作休息

def login(user='ssdf', password="cisin123"): 
content = browser.find_element_by_id('content') 
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user) 
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password) 
content.find_element_by_css_selector(".button").click() 
+1

虽然其他评论回答了“为什么?”的基本问题,但只有这个答案告诉你如何解决实际问题。 – rbp

6

您可以使用硒与Firefox为解决这个问题,但它可能不适合在许多情况下,因为每次运行代码时都会弹出浏览器。另一个想法是使用像PhantomJS这样的无头式传送带。

最好的方法是使用机械库。通过pip安装机械化。

pip install mechanize 

然后你可以用下面的代码:

import mechanize 

mb = mechanize.Browser() 
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
mb.set_handle_robots(False) 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
response = mb.open(url).read() 
print response 

它还提供了选项的睡眠和执行脚本。你可以在documentation.