“cannot use parentheses”是个什么鬼

VBScript里你是怎么调用sub(子程序)的呢?
当然这样啊:

MySub1(MyArg)

可是,当别外一个sub有多个参数时呢?

MySub2(MyArg1,MyArg2)

它竟然出错!cannot use parentheses!不能使用括号!这是个什么鬼!
先说结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。
只能这样:

MySub2 MyArg1,MyArg2

骗人,明明可以啊!……好吧……其实:

MySub1(MyArg)

程序的真正理解是:

MySub1 (MyArg)

注意中间有个空格!而(MyArg)的意思是:以ByVal的方式传递参数!
VBScript里调用函数(function)或子程序(sub)时,(定义function和sub时如果你没有声明ByVal)默认是以ByRef的方式传递参数的;如果function或sub已经定义了参数是ByRef的,你还可以强制以ByVal的方式传递参数,那就是给参数加上括号。所以:

MySub1 (MyArg)

的真正意思是:调用MySub1并且以ByVal的方式传递参数MyArg。
先记着结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。所以:

MySub2(MyArg1,MyArg2)

会直接出错,正确的写法是:

MySub2 MyArg1,MyArg2

呃……一直在说以一般方式调用sub,那么不一般的方式是什么啊?
就是用Call来调用sub,并且用Call的时候参数必须用括号了:

MySub2(MyArg1,MyArg2)

总的来说:
括号在VB中的几个意思:

  1. 对括号内的表达式求值,例如:Average = (First + Last) / 2
  2. 引用数组的第几个元素,例如:Item = MyArray(Index)
  3. 调用函数(function)或子程序(sub),例如:Limit = UBound(MyArray)
    • 如果函数调用被赋值,那么它的参数必须使用括号:Result = MyFunc(MyArg)
    • 使用Call调用函数或子程序时它的参数必须使用括号:Call MySub(MyArg)
    • 如果不是以上两种情况,则不能使用括号。
  4. 强制以byval的方式传递参数:Result = MyFunction(Arg1, (Arg2)) ‘Arg1是byref,Arg2是byval

检查网址存活性

通过python可以很方便的检测一个网址的存活(是不是404),即检测状态码,这种方式不必等待整个网址下载完整。

def check_url(url:str):
    p = urlparse(url)
    conn = HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return resp.status < 400

使用起来也非常简单:

# True
check_url("http://www.baidu.com")
# False
check_url("http://www.baidu.com/does-not-exists.html")

Firefox火狐扩展(addon) open with referer

虽然Firefox的占有率越来越低了,但毕竟适合自己才是最好的,Firefox仍然是我的首先浏览器,这上面有vimperator、adblock、flashinspector……

需要的话还可以自己写些扩展(现在叫附加组件)。

我的工作需要经常测试网站在不同来路下的表现,open with referer就是一个适合这样的小工具。安装后,你会在右上角看到一个图标,点击这个图标,网页就会以带有http referer的方式打开(设置请求消息头的referer)。

打开菜单-附加组件-open with referee,先设置你要使用的来路

点击右上角open with referee的图标

open with referee会设置消息头的referee字段

selenium python停止Firefox加载(续)

如果你在使用selenium python时也碰到firefox一直加载的问题,而又没有比较好的解决方法,那么你也许可以试下这个反过来的思路:当它加载超时抛出异常。
仔细看selenium python的源码,发现它有一个api:

driver.set_page_load_timeout

注意单位是秒,如果网页加载超过了你设置的时间,那么它会发生异常:

selenium.common.exceptions.TimeoutException: Message: Timed out waiting for page load.

同时它还有另外一个api:

driver.set_script_timeout

这个是用来设置网页上脚本执行的超时时间(秒)。