AppleScript 从网页特定部分的 URL 保存文档

AppleScript saving documents from urls from particular part of webpage

本文关键字:URL 保存 文档 定部 网页 AppleScript      更新时间:2023-09-26

我正在尝试编写一个AppleScript,该脚本从网页的特定部分(表格)保存和下载所有网址,并将它们保存到文件夹中。所有链接都是链接到Youtube的pdf或视频。我想从中获取链接的表格是按周、日期和材料组织的。我想要一个包含所有周的文件夹,然后在里面是每个日期的文件夹,以及包含该日期材料的另一个文件夹。(我的资料/周/日期/材料)例如

<div class="table">
<div class="row"> 
  <div class="topcell">Week </div>
  <div class="topcell">Date</div>
  <div class="topcell">Material</div>
</div>
</div>  <!-- end table-->

从一些研究中,我看到有些人在他们的实现中使用JavaScript来打开文档? http://macscripter.net/viewtopic.php?id=20287 我尝试使用这样的东西,但无法编译。

我是新手,所以任何帮助将不胜感激! :)

到目前为止,我拥有的:

tell application "Finder"
    set p1 to path to user/Desktop
    make new folder at p with properties {name:"AllMaterial"}
    --Make AllMaterial Folder--
    set p2 to path to user/Desktop/AllMaterial 
    repeat with i from 1 to 18
        make new folder at p2 with properties {name:"Week" + i}
        --Make all the weeks--
        --in each week, make 3 days--
        set p3 to path3 to user/Desktop/AllMaterial/"Week" + i 
        repeat with j from 1 to 3
            make new folder at p2 with properties {name:"Day" + j}
        end repeat
    end repeat
        --Make all the days--
end
set siteURL to "XXX"
tell application " Safari"
    activate
    open location siteURL
    --wait until page loaded
    if my page_loaded(20) is false then error numner - 128
        set numLinks to (do JavaScript "document.links.length" in document1)
        --(do JavaScript "document.body.table.links.length" in document1)--
        --get num of links --(doesn't account for the "table" that I want ^^. There are multiple     different links on the page )
    set count to numLinks - 1,
    set thisLink to "",
    set f to false
    repeat with i from 0 to count
        set thisLink to do JavaScript
end tell

问题是你是想学习如何做,还是只是想让别人给你一个完整的脚本?我可以帮助前者而不是后者。

要学习如何编写脚本,您需要了解您要实现的目标以及用于完成工作的工具。

您必须

学习或理解的三件事才能解决您正在处理的问题:Applescript,Javascript和文档对象模型。


JS和DOM

首先,让我们处理内容以及为什么你不能用Javascript抓取它:

    <div class="table">
     <div class="row"> 
      <div class="topcell">Week </div>
      <div class="topcell">Date</div>
      <div class="topcell">Material</div>
    </div>
   </div>  <!-- end table-->

这不是一张桌子!

这些

是带有类的div,这些类使用 CSS 以这样的方式布局,看起来像一个表。这就是为什么您在导航页面的 DOM 时遇到问题的原因。

(do JavaScript "document.body.table.links.length" in document1)--
        --get num of links --(doesn't account for the "table" that I want ^^. There are multiple     different links on the page )

这不起作用,因为没有桌子!

您需要从正确的位置检索链接。那里没有真正的桌子,每个都是一个div。

我很想向您展示一个工作示例,但"表格"包含的内容不足以给出一个工作示例。链接到底在哪里?

那么,让我们做一个工作示例

    <div class="table">
     <div class="row"> 
      <div class="topcell">Week</div>
      <div class="example">
       <a href="test">TEST</a>
      </div>
      <div class="topcell">Date</div>
      <div class="topcell">Material</div>
    </div>
   </div>  <!-- end table-->

现在我们知道链接在哪里,但您需要了解 DOM...以下:

document.getElementsByClassName('example')[0].getElementsByTagName('a')[0].href;

将获得第一个的 href 文档的第一个元素的链接,其类名是示例(0 是 Javascript 中的第一个)。我们通过转到 1 来移动到下一个 a:

document.getElementsByClassName('example')[0].getElementsByTagName('a')[1].href;

这不是用于解决您的问题的方法,但这是您需要前进的一个很好的例子。

你可以在这里阅读更多关于用Javascript导航DOM的信息,或者很多地方,只需谷歌一下。


苹果脚本

您使用Applescript的唯一原因是因为您在Mac上...你不需要学习Applescript来完成这个,但它不会有什么坏处。

不过,您确实需要学会正确地做到这一点...零是正确的,你的Applescript在很多层面上都是错误的......

小步骤,但这里有一个示例,说明它应该如何

tell application "Finder"
    set p1 to (path to desktop folder) as string
    --Make AllMaterial Folder--
    try
        make new folder at p1 with properties {name:"AllMaterial"}
    on error
        --it exists! IT WILL ERROR IF THERE IS A FOLDER ALREADY
    end try
    set p2 to p1 & "AllMaterial" as string
    repeat with i from 1 to 18
        set thisfolder to make new folder at p2 with properties {name:"Week" & i as string}
        --Make all the weeks--
        --in each week, make 3 days--
        repeat with j from 1 to 3
            set thisdaysfolder to make new folder at thisfolder with properties {name:"Day" & j as string}
            ---WHILE IN THIS LOOP thisdaysfolder IS THE REFERENCE TO THE FOLDER TO SAVE IN… SO HERE IS WHERE YOU SAVE TO OR SOME ORDER OR LOGIC...
        end repeat
    end repeat
end tell

将其捆绑在一起

将所有内容组合在一起以制作完整的脚本取决于网站上的实际数据。

从网站获取数据的部分需要将数据存储到 applescript 列表中,或者在制作文件夹时可能重复抓取数据,等等......这真的取决于你作为编码员。

最后,您需要保存文件,并且很可能希望通过shell脚本和一些引用的形式使用cURL:

do shell script "curl -f " & quoted form of thisURL & " -o " & quoted form of (POSIX path of savelocation) & filesname ---(this is a variable with the file name) 

这显然不是一个完整的解决方案,但会让你朝着正确的方向前进。