0

我有一个包含 URL 列表的输入文件。我正在尝试在每个 URL 上执行一个脚本,并将该脚本的结果输出到 CSV。

一个示例是尝试查找给定的网站列表是否正在使用 Google Analytics。下面的脚本在页面上下文中运行时将返回类似“{'GA': true}”的 JSON。

var scripts = document.getElementsByTagName("script");
var source = [];
for (var i = 0; i < scripts.length; i ++) {
    var s = scripts[i];
    if (!s.src) continue;
    source.push(s.src);
}
checkforGA();


function checkforGA() {
    var tools = {};
    for (var j = 0 ; j < source.length; j ++) {
        if (/google-analytics.com\/(ga|urchin).js/i.test(source))
        {
            tools.GA = true;
            return JSON.stringify(tools);
        }
        else 
        {
            tools.GA = false;
            return JSON.stringify(tools);
        }
    }
}

我的输入是一个包含站点列表的 csv 文件

Google, http://google.com
Wikipedia, http://wikipedia.com
Techcrunch, http://techcrunch.com
Stackoverflow, http://stackoverflow.com
Yahoo, http://yahoo.com

我想要的输出是

Google, http://google.com, {'GA': false}
Wikipedia, http://wikipedia.com, {'GA': false}
Techcrunch, http://techcrunch.com, {'GA': true}
Stackoverflow, http://stackoverflow.com, {'GA': true}
Yahoo, http://yahoo.com, {'GA': false}

我不确定是否可以从 python 脚本中运行 js,但我正在寻找一些关于如何开始的想法。

4

3 回答 3

0

为什么不只在 JS 中完成这一切 - 例如使用 PhantomJS - https://code.google.com/p/phantomjs/

于 2012-04-16T02:48:30.990 回答
0

使用 RE 运行 HTML 有时会在复杂的文档中出现问题。你为什么不尝试使用BeautifulSoup来代替这样的东西呢?它就是为此而生的。我包含了一个使用请求模块在 SO 上尝试此操作的示例。

from bs4 import BeautifulSoup
import requests

r = requests.get('http://www.stackoverflow.com')

soup = BeautifulSoup(r.text)

alist =  soup.find_all('script')
for script in alist:
    try:
        if script.text.find('var _gaq=_gaq') != -1:
            print 'found'
        else:
            print 'not found'
    except KeyError:
        print 'no src'

顺便说一句,如果人们将他们的 GA 初始化程序放在其他脚本中,这种方法不会捕获所有内容......您可能想使用 Selenium 来检查是否存在“_gaq”变量......

于 2012-04-15T19:38:47.703 回答
0

您最好的选择是加载页面的文本,然后使用 re 模块搜索您的正则表达式。

于 2012-04-15T16:53:10.283 回答