我想不出逃离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
调用中被解释为'.'
我希望这是有道理的。我无法测试。