如何在lua代码中选择查询选择器的escape splash

我找不到正确的方法来转义 splash:select 中的点

我有一个 scrapy 中的 splash 请求,它使用 lua 等待特定元素。该元素是带有点的 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,而不是包含句点的 div)

点赞
用户2858170
用户2858170

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

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

你的 splash 需要你转义 .

因此,我们需要添加一个反斜杠。

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

由于我们仍然处于 Python 字符串中,因此我们必须再次转义这两个反斜杠。总共需要四个反斜杠。

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

Python '\\\\.' 会被 Lua 解释为 '\\.',最终在 splash:select 调用中变成了 '\.'

我希望这样有意义。我无法测试。

2019-11-13 08:49:54