为什么urllib.urlopen.read()与源代码不对应?

时间:2012-09-17 20:48:38

标签: python urllib urlopen

我正在尝试获取以下网页:

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

结果与我在使用谷歌浏览器检查网页源代码时看到的结果不一致。

你能告诉我为什么会这样,以及我如何改进我的代码以克服这个问题?

感谢您的帮助。

5 个答案:

答案 0 :(得分:10)

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

因此存在差异,希望这很明显

答案 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()

答案 2 :(得分:6)

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

最好的方法是使用mechanize库。通过pip安装mechanize。

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.

中阅读它们

答案 3 :(得分:3)

此外,一些网站有一个所谓的浏览器切换,当使用不同的浏览器时可能会导致显示不同的来源(例如,为移动浏览器显示简易版本)。

查看http://www.diveintopython.net/http_web_services/user_agent.html如何将用户代理更改为“Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.1(KHTML,如Gecko)Chrome / 21.0.1180.89 Safari / 537.1“(实际上是我的用户代理)。

答案 4 :(得分:1)

听起来你想要一个可以像浏览器一样运行javascript的库,然后为你提供生成的源代码。风车应该能够为你做到这一点。 (http://www.getwindmill.com/

有一篇关于如何在这里使用它的好文章:
http://www.packtpub.com/article/web-scraping-with-python