html绕过noscript标签

时间:2015-01-13 15:49:34

标签: python html noscript

我使用python库请求下载一些网页并在此之后进行一些解析,例如,获取页面的标题。但是,当某些网页上出现<noscript>标记时,请求似乎无法正确下载来源。

例如,在尝试获取https://www.coursera.org/course/startup的来源时,我从请求获得的来源与使用Chrome访问该网页的来源不同。源请求获取与Chrome中的视图源选项相同。

有没有办法去傻瓜&#34; {@ 1}}标签在某种程度上?或者我需要使用其他东西而不是请求?

2 个答案:

答案 0 :(得分:2)

“源请求获取与Chrome中的视图源选项相同”...查看源为您提供了URL的真实html源,与请求获得的相同。所以你所看到的就是你期望看到的东西。

您的问题与noscript标记无关,而是在加载后通过javascript更改页面内容。

正如@alecxe指出的那样,您需要深入了解coursera网站的构建方式,例如在Chrome开发者工具的“网络”标签中观察XHR请求,以查看您要查找的实际内容的网址从...加载然后您可以直接使用请求加载这些网址。

另外,这里有一个教程,介绍如何解决使用python中的javascript渲染网页的问题:
https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

它们提供的示例代码如下所示:

import sys  
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  
from lxml import html 

#Take this class for granted.Just use result of rendering.
class Render(QWebPage):  
  def __init__(self, url):  
    self.app = QApplication(sys.argv)  
    QWebPage.__init__(self)  
    self.loadFinished.connect(self._loadFinished)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit()  

url = 'http://pycoders.com/archive/'  
r = Render(url)  
result = r.frame.toHtml()
#This step is important.Converting QString to Ascii for lxml to process
archive_links = html.fromstring(str(result.toAscii()))
print archive_links

答案 1 :(得分:1)

此特定页面通过一组对Coursera API的异步XHR调用呈现。然后,API响应用于构造页面。这一切都是由浏览器完成的。

requests只需下载初始HTML页面,在这种情况下,它基本上是许多其他内容的容器。 requests没有内置的javascript引擎,它不是浏览器。

根据您接下来要做什么,您可以在selenium的帮助下自动化真实的浏览器(无头或无头),或者模仿正在制作的API requests通过浏览器 - 后者的方法将涉及探索Coursera API,使用浏览器开发人员工具查看用于使用数据填充页面的API端点。

示例(使用seleniumChrome浏览器):

>>> from selenium import webdriver
>>> from selenium.webdriver.common.by import By
>>> from selenium.webdriver.support.ui import WebDriverWait
>>> from selenium.webdriver.support import expected_conditions as EC
>>>
>>> driver = webdriver.Chrome()
>>> driver.get('https://www.coursera.org/course/startup')
>>> element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.c-coursePage-header h1")))
>>> element.text
u'Startup Engineering'
相关问题