从AppleScript应用程序

时间:2018-05-30 07:14:57

标签: python-3.x web-scraping applescript

我想知道是否可以在 AppleScript App 中运行以下脚本。

所有这一切背后的想法是,人们不需要运行和处理代码,说他们不需要从 SublimeText 左右运行它,而只需点击一下应用程序让脚本运行并完成工作。如果这对你有用吗?

from bs4 import BeautifulSoup
import requests
import csv

class_1 = {"class": "productsPicture"}
class_2 = {"class": "product_content"}
class_3 = {"class": "id-fix"}

# map a column number to the required find parameters
class_to_find = {
0 : class_3,    # Not defined in question
1 : class_1,    
2 : class_1,
3 : class_3,    # Not defined in question
4 : class_2, 
5 : class_2}

with open('urls.csv', 'r') as csvFile, open('results.csv', 'w', newline='') as results:
reader = csv.reader(csvFile)
writer = csv.writer(results)

for row in reader:
    # get the url

    output_row = []

    for index, url in enumerate(row):
        url = url.strip()

        # Skip any empty URLs
        if len(url):
            #print('col: {}\nurl: {}\nclass: {}\n\n'.format(index, url, class_to_find[index]))

            # fetch content from server

            try:
                html = requests.get(url).content
            except requests.exceptions.ConnectionError as e:
                output_row.extend([url, '', 'bad url'])
                continue
            except requests.exceptions.MissingSchema as e:
                output_row.extend([url, '', 'missing http...'])
                continue

            # soup fetched content
            soup = BeautifulSoup(html, 'html.parser')


            divTag = soup.find("div", class_to_find[index])

            if divTag:
                # Return all 'a' tags that contain an href
                for a in divTag.find_all("a", href=True):
                    url_sub = a['href']

                    # Test that link is valid
                    try:
                        r = requests.get(url_sub)
                        output_row.extend([url, url_sub, 'ok'])
                    except requests.exceptions.ConnectionError as e:
                        output_row.extend([url, url_sub, 'bad link'])
            else:
                output_row.extend([url, '', 'no results'])      

    writer.writerow(output_row)

1 个答案:

答案 0 :(得分:1)

  1. 在macOS上打开 AppleScript编辑器

  2. 在新窗口中添加以下两行代码:

    set desktop_folder to "$HOME/Desktop"
    do shell script "python " & desktop_folder & "/Pricematch/foo.py"
    

    注意:这假定foo.py文件已保存到用户 Desktop 文件夹中名为 Pricemacth 的文件夹中。您需要将foo.py部分替换为实际的真实文件名。

    由于desktop_folder变量设置为"$HOME/Desktop",您应该能够将此问题转发给多个用户而不会出现任何问题。您只需确保名为 Pricematch 的文件夹位于其 Desktop 文件夹中,它包含要运行的.py文件。 $HOME部分将自动采用用户文件夹,因此您无需为每个用户指定不同的用户名。

    如果您决定更改.py的位置,则需要相应地更新AppleScript中的路径。

  3. 要保存AppleScript:

    • 选择文件>从菜单栏中另存为
    • 选择文件格式> 应用
    • 输入文件名。例如。 run-python-script.app
    • 点击Save按钮。 (它可以保存在任何文件夹位置)
  4. 双击run-python-script.app中的Finder进行操作。

  5. 修改

    回应评论:

      

    当python脚本完成他的工作时,是否有可能以某种方式获得通知。

    以下是一些建议 - 它假设python脚本返回零/成功退出状态。您可以尝试将 AppleScript 中的第二行更改为:

    1. 用于显示对话框消息:

      do shell script "python " & desktop_folder & "/Pricematch/foo.py && osascript -e 'tell application \"Finder\" to activate' -e 'tell application \"Finder\" to display dialog \"Finished Python Script\"'"
      
    2. 或者,说些什么:

      do shell script "python " & desktop_folder & "/Pricematch/foo.py && osascript -e 'set Volume 4' -e 'tell application \"Finder\" to say \"Finished!\"' -e 'set Volume 0'"