如何从已选择的元素对象中选择元素与 Splash 一起使用

使用 splash:select 选中一个元素对象后,如何选择其下找到的所有锚点元素?

我尝试了以下 lua 脚本与 scrapy/splash:

function main(splash)
    assert(splash:go(splash.args.url))
    assert(splash:wait(0.9))

    local classlist = splash:select('.class-list')
    local alinks = classlist:select_all('a')

    return {alinks=alinks}

end

但我得到了以下错误的请求到 Splash 错误:

{
    u'info':{
        u'line_number':12,
        u'message':        u'Lua error:[
            string "..."
        ]:12:attempt to call method \'select_all\' (a nil value)',
        u'type':u'LUA_ERROR',
        u'source':u'        [
            string "..."
        ]        ', u'        error':u"attempt to call method 'select_all' (a nil value)"
    },
    u'type':u'ScriptError',
    u'description':u'执行 Lua 脚本时发生错误',
    u'error':400
}

我已确认 splash:select('.class-list') 返回一个有效的元素对象。

点赞
用户5287638
用户5287638

正如您所说,splash:select('.class-list') 返回一个有效的元素对象。您的问题是元素对象没有 select_all 方法,只有 splash 对象有。因此,您需要使用不同的选择器来使用 splash:select_all。尝试以下代码(但请注意,它尚未经过测试)。

function main(splash)
    assert(splash:go(splash.args.url))
    assert(splash:wait(0.9))
    local alinks = splash:select_all('.class-list a')
    return {alinks=alinks}
end
2017-05-17 02:15:58