【问题标题】:Inserting text or html into .notebook将文本或 html 插入 .notebook
【发布时间】:2011-06-20 13:00:45
【问题描述】:

我想将网页的输出插入笔记本(本质上是文本或 html“屏幕截图”)。不需要它是“活的”,它只是供参考。

理想情况下,它看起来就像在网络浏览器上一样。我希望它是不可评估的,我不希望前端试图将其格式化为一个非常错误的 Mathematica 表达式

(编辑添加:创建一个单元格并执行“单元格->转换为->文本显示”是一种无需前端重新格式化即可显示文本的足够好方法。我想知道这是否是“正确的" 这样做的方法或者是否有更好的方法,特别是如果我也想要 html 格式或图形)

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    据我所知,Mathematica 无法呈现 HTML 页面。使用Import,您可以从基于 html 的站点和文件中获取各种信息。一种选择是获取基于文本的网站版本,如下所示:

    Import["http://reference.wolfram.com/mathematica/guide/Mathematica.html", "Plaintext"]
    

    【讨论】:

    • 是的,您还可以获得更多结构化输入。例如,如果您的网站有表格,您可以使用“Data”或“FullData”而不是“Plaintext”在列表中获取它,如果您想要 html 源代码使用“Source”等。
    • "...Mathematica 无法呈现 HTML 页面..." 很可能最终成为答案;那好吧。在我的情况下,我不能从网站上Import,因为我感兴趣的是计算的输出(即我想要的输出没有静态 URL)。
    • 我喜欢这个。 Import["http://reference.wolfram.com/mathematica/guide/Mathematica.\ html", "Elements"] 给出了选项列表 {"Data"、"FullData"、"Hyperlinks"、"Images"、"ImageURLs"、\"Plaintext"、"Source"、"Title"、"XMLObject"}。例如Import["http://reference.wolfram.com/mathematica/guide/Mathematica.\ html", "Images"]
    • @Daniel 不需要静态 URL。如果您的 URL 应该包含动态计算的内容,那么这并不难。示例:导入["some.site.com/staticpart?p"<>ToString[pageNumber]]
    • @enedene 结构化输出没有让 OP 比纯文本更接近页面渲染。
    【解决方案2】:

    如果您使用的是 Windows(使用 .NET),那么您可以结合使用 Mathematica 的 NETLink 功能和 WebBrowser 类来捕获网页的屏幕截图:

    Needs["NETLink`"]
    LoadNETType["System.Drawing.Imaging.ImageFormat", AllowShortContext -> False]
    LoadNETType["System.Windows.Forms.WebBrowserReadyState", AllowShortContext -> False]
    
    Options[dotNetBrowserScreenshot] = {Width -> 1024, Height -> Automatic};
    dotNetBrowserScreenshot[uri_, OptionsPattern[]] :=
      NETBlock @ Module[{browser, bitmap, tempFile, image, bounds}
      , browser = NETNew["System.Windows.Forms.WebBrowser"]
      ; browser@Width = OptionValue[Width]
      ; browser@ScrollBarsEnabled = False
      ; browser@Navigate[uri]
      ; tempFile = Close@OpenWrite[]
      ; While[browser@ReadyState =!= System`Windows`Forms`WebBrowserReadyState`Complete
        , Pause[0.05]
        ]
      ; bounds = browser@Document@Body@ClientRectangle
      ; browser@Height = OptionValue[Height] /. Automatic -> bounds@Height
      ; bitmap = NETNew["System.Drawing.Bitmap", browser@Width, browser@Height]
      ; browser@DrawToBitmap[bitmap, bounds]
      ; browser@Dispose[]
      ; bitmap@Save[tempFile, System`Drawing`Imaging`ImageFormat`Png]
      ; bitmap@Dispose[]
      ; image = Import[tempFile, "PNG"]
      ; DeleteFile[tempFile]
      ; image
      ]
    

    使用示例:

    可以使用Height -&gt; Automatic(这是默认设置)捕获完整的网页。请注意,屏幕截图是以缩小的放大率显示的。

    【讨论】:

    • 非常酷! +1。是否可以捕获完整的网页?
    • @Alexey 是的。我更新了dotNetBrowserScreenshot 的定义,以自动从HTML 文档的边界确定屏幕截图的高度。对于非常大的文档,您仍然可以指定显式的 WidthHeight 选项来裁剪文档。
    【解决方案3】:

    如果您只想要文本(可能带有样式),请选择网页上的文本,在 Mathematica(Mac 上为 cmd-7)中创建一个文本单元格,然后粘贴。

    【讨论】:

    • 我无法在 Mathematica 的 linux 版本上找出“cmd-7”等价物。您所做的是否等同于创建一个单元格,然后在我的问题中进行编辑“”单元格->转换为->文本显示”?
    • @Daniel 在 Windows(可能还有 Linux)下,用于创建新文本单元格(并将选定的单元格转换为文本单元格)的键盘组合是 Alt+7。您可以在Format -&gt; Style 菜单中看到此组合。
    【解决方案4】:

    一种可能性是将网页转换为 PDF,然后 Import 这个 PDF 文件。此方法应提供与您在浏览器中看到的相似的原始页面的矢量图像。

    另一种可能性是在浏览器中制作该网页的屏幕截图并将其插入笔记本中。也可以通过在一些支持转换为光栅格式的虚拟打印机上打印网页来制作比显示器分辨率更高的“屏幕截图”(LEADTOOLS ePrint 是最好的之一)。


    编辑

    一个有趣的替代手工截屏的方法是使用谷歌网页缩略图服务。我对此知之甚少,但您可以将其编码为任何网页的 JavaScript JPEG 缩略图,其 URL 类似于

    http://www.google.com/webpagethumbnail?r=2&f=2&s=300:585&query=wolfram&hl=ru&gl=us&c=11&d=http%3A%2F%2Fintegrals.wolfram.com%2F&b=1&j=google.vs.r&a=D57

    这个 URL 给出了一个包含以下元素的文件:

    ["数据:图像/jpeg;base64,"]

    &lt;data&gt; 这里是编码 JPEG 图像数据的首字母缩写)。

    我们可以通过以下方式在Mathematica中提取data

    data = Import[
      "http://www.google.com/webpagethumbnail?r=2&f=2&s=300:585&query=\
    wolfram&hl=ru&gl=us&c=11&d=http%3A%2F%2Fintegrals.wolfram.com%2F&b=1&\
    j=google.vs.r&a=D57"];
    
    imageData = 
      StringReplace[
       data, __ ~~ "[\"data:image/jpeg;base64," ~~ x__ ~~ "\"]," ~~ __ :> 
        x]
    

    我不知道如何进一步转换imageData,但这只是知道JPEG格式规范的问题......

    【讨论】:

    • 我没想到。如果我可以复制粘贴进去就好了,但我会尝试打印到 PDF 并导入..
    • 根据您的浏览器,您可能会找到一个可以截取页面截图并将其放在剪贴板上的扩展程序。然后将其粘贴到 Mathematica 中。
    • 从 Mathematica 6 开始,您可以使用 Import[url, {"Base64", "JPEG"}] 导入 base64 编码的 JPEG Web 资源。
    【解决方案5】:

    如果您在 OS X 上,ctrl+shift+cmd+4 会导致光标变为十字形,当前坐标位于其旁边;选择屏幕上的任意矩形区域会将其复制到剪贴板,您可以从中将其粘贴到 mma 中(作为光栅图形)。

    在其他操作系统中肯定有这样做的方法。

    【讨论】:

    • 在快捷方式后输入空格可让您轻松选择整个窗口。另请注意,这只获取屏幕上可见的页面部分。还有其他程序/浏览器扩展可以获取整个页面,甚至是滚动到屏幕外的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多