0

我想不出正确的方法来逃避splash:select

我在 scrapy 中有一个使用 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)

4

1 回答 1

1

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

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

你的飞溅物需要你逃离.

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

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

由于我们仍在 Pyhton 字符串中,我们必须再次转义 2 个反斜杠。结果总共有四个反斜杠。

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

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

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

于 2019-11-13T08:49:54.877 回答