【问题标题】:Splash API/lua error: attempt to index local element (a nil value)Splash API/lua 错误:尝试索引本地元素(零值)
【发布时间】:2017-01-12 20:46:51
【问题描述】:

我正在编写一个 lua 脚本,我想将它与 scrapy + splash 一起用于网站。我想编写一个输入文本然后单击按钮的脚本。我有以下代码:

function main(splash)
   local url = splash.args.url
   assert(splash:go(url))
   assert(splash:wait(5))

   local element = splash:select('.input_29SQWm')
   assert(element:send_text("Wall Street, New York"))
   assert(splash:send_keys("<Return>"))
   assert(splash:wait(5))

   return {
     html = splash:html(),
   }
end

现在我正在使用 splash API 来测试我的代码是否正常运行。当我点击“渲染!”我收到以下消息:

{
  "info": {
      "message": "Lua error: [string \"function main(splash)\r...\"]:7: attempt to index local 'element' (a nil value)",
      "type": "LUA_ERROR",
      "error": "attempt to index local 'element' (a nil value)",
      "source": "[string \"function main(splash)\r...\"]",
      "line_number": 7
  },
  "error": 400,
  "type": "ScriptError",
  "description": "Error happened while executing Lua script"
}

因此,由于某种原因,当我尝试发送“华尔街,纽约”时,元素仍然为零。我不明白为什么;如果我在 chrome 控制台中输入以下内容:

$('.input_29SQWm')

我找到了想要的元素!

问:有谁知道我做错了什么?

提前致谢!

【问题讨论】:

  • nil 值表示document.querySelector('.input_29SQWm') 没有返回任何结果。为什么这发生在 Splash 而不是 Chrome?很难说。也许有一些错误会阻止元素出现在 Splash 中。对于调试,您可以例如在第一个 splash:wait() 之后返回 splash:html()splash:png() 以检查该元素是否存在于页面上。

标签: javascript lua scrapy scrapy-splash


【解决方案1】:

正如错误消息告诉您的那样,您尝试索引一个为 nil 的本地“元素”。 错误出现在第 7 行:assert(element:send_text("Wall Street, New York"))

那么为什么是nil?在第 6 行中,我们为 element 分配了一个值

local element = splash:select('.input_29SQWm')

显然splash:select('.input_29SQWm') 返回nil

让我们看一下文档:

http://splash.readthedocs.io/en/stable/scripting-ref.html#splash-select

如果使用指定的选择器找不到元素 nil 将 被退回。如果您的选择器不是有效的 CSS 选择器,则会出现错误 将被提升。

您的错误在于没有处理 select 可能返回 nil 的情况。您不能盲目地索引可能是nil 的值。 此外,在调用引发错误的函数时,您应该使用受保护的调用。

现在由你来找出为什么 select 没有找到使用该选择器的元素。

我建议你在继续之前阅读一些关于 Lua 错误处理的内容。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2016-06-21
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多