我正在使用scrapy和splash来抓取这个网站,出于某些原因,我正在使用splash和scrapy,即使我知道我可以抓取它的API。我的问题是我只希望我的lua脚本只返回工作列表的urls
而不是整个splash:html()
页面,我一直在尝试这样做,但我收到以下错误消息:-
{
"error": 400,
"description": "Error happened while executing Lua script",
"type": "ScriptError",
"info": {
"message": "Lua error: /app/splash/lua_modules/libs/treat.lua:45: cannot change a protected metatable",
"type": "LUA_ERROR"
}
}
我一直使用的lua脚本也如下所示:-
function main(splash, args)
assert(splash:go(args.url))
splash:wait(5.0)
local treat = require('treat')
listings = assert(splash:select_all("ul.job_listings > li> a"))
return {
listing_urls = treat.as_array(listings)
}
end
function treat.as_array(tbl)
-- the same function is available in
-- Splash Python code as lua._mark_table_as_array
if type(tbl) ~= 'table' or wraputils.is_wrapped(tbl) then
error('as_array argument must be a table', 2)
end
setmetatable(tbl, {__metatable="array"})
return tbl
end
treat.as_array
尝试更改其参数的元表。
导致此错误的原因是listings
元表设置了__metatable
字段。
从 https://www.lua.org/manual/5.3/manual.html#pdf-setmetatable
如果原始元表具有__metatable字段,则会引发错误。