escapesplash:在lua代码中选择查询选择器



我想不出逃离splash:select中周期的正确方法

我在scrapy中有一个splash请求,它使用lua来等待特定的元素。这个元素是一个id,id中有句点。我似乎无法正确地转义句点。我尝试过单反斜杠和双反斜杠(\(

lua_script = '''
function main(splash)
splash:set_user_agent(splash.args.ua)
assert(splash:go(splash.args.url))
while not splash:select('div#some.id.here') do
splash:wait(0.1)
end
return {html=splash:html()}
end
'''

预期结果是从请求的页面中完全加载的html

实际结果是:

WARNING: Bad request to Splash: {'description': 'Error happened while executing Lua script', 'error': 400, 'type': 'ScriptError', 'info': {'error': "invalid escape sequence near '\.'", 'source': '[string "..."]', 'message': '[string "..."]:5: invalid escape sequence near '\.'', 'line_number': 5, 'type': 'LUA_INIT_ERROR'}}

使用\

如果我尝试按如下方式转义splash:select中的字符串:

splash:select('div#some.id.here')

代码持续运行(我相信这是朝着正确方向迈出的一步,但我认为在现阶段代码运行正确,但它试图找到一个多类别的div,而不是ID包含句点的div(

您有一个包含Lua代码的Python字符串。

'splash:select('div#some.id.here')'

你的飞溅物需要你逃离.

所以我们需要在前面加一个反斜杠。

为了避免Lua中出现无效的转义序列.错误,我们必须在反斜杠前面加上另一个反斜杠来转义。\.

由于我们仍然在Pyhton字符串中,我们必须再次转义这两个反斜杠。总共产生四个反斜杠。

'splash:select('div#some\\.id\\.here')'

Python'\\.'将被Lua解释为'\.',最终在您的splash:select调用中被解释为'.'

我希望这是有道理的。我无法测试。

最新更新