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

Nik*_*lov 12 python urllib urlopen

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

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

结果与我在使用Google Chrome检查网页源代码时看到的结果不一致.

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

谢谢您的帮助.

Sri*_*aju 10

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

因此,差异,希望这是明确的

  • @delnan OP没有明确表示他正在使用View Source(它没有改变)而不是Inspect Element(确实如此). (2认同)

Yog*_*tpl 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
Run Code Online (Sandbox Code Playgroud)

然后根据您的选择继续工作,使用浏览器实例进行更多示例

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()
Run Code Online (Sandbox Code Playgroud)

  • 尽管其他评论回答了基本问题“为什么?”,但只有这个答案告诉您如何解决实际问题。 (2认同)

Sud*_*fle 7

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

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

pip install mechanize
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下代码:

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
Run Code Online (Sandbox Code Playgroud)

它还提供睡眠和执行脚本的选项.您可以在文档中阅读它们.