首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >html绕过noscript标记

html绕过noscript标记
EN

Stack Overflow用户
提问于 2015-01-13 23:49:34
回答 2查看 2.8K关注 0票数 2

我正在使用python库请求下载一些网页,然后进行一些解析,例如,获取页面的标题。然而,当一些网页上有<noscript>标签时,请求似乎不能正确下载源代码。

例如,当我试图获取https://www.coursera.org/course/startup的源代码时,我从请求中获取的源代码与使用Chrome访问页面的源代码不同。source request get与Chrome中的view source选项相同。

那么有没有办法以某种方式“愚弄”<noscript>标记呢?或者我需要使用其他东西而不是请求?

EN

回答 2

Stack Overflow用户

发布于 2015-01-13 23:55:51

所以你所看到的就是你应该看到的。

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

正如@alecxe指出的那样,你需要更深入地研究coursera网站是如何构建的,比如观察Chrome开发者工具的'Network‘标签中的XHR请求,看看你正在寻找的实际内容是从哪里加载的urls……然后,您可以直接使用请求加载这些urls。

或者,这里有一个教程可以帮助你解决在python中使用javascript渲染网页的问题:

https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

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

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2015-01-13 23:59:07

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

requests只是下载初始的超文本标记语言页面,在本例中,该页面基本上是许多其他内容的容器。requests没有内置的javascript引擎,它不是一个浏览器。

根据您下一步要做什么,您可以在例如selenium的帮助下自动化真正的浏览器(无头或无头),或者模拟浏览器生成的API requests -后一种方法将涉及探索Coursera API,使用浏览器开发人员工具来查看使用哪些API端点来填充页面数据。

示例(使用seleniumChrome浏览器):

代码语言:javascript
复制
>>> 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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27926033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档