Проблема с Splash, возвращающим несколько снимков HTML - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь вернуть несколько html-страниц, используя скрипты-заставки (в одном ответе, как в документации) и извлекая из них ссылки.Но я обнаружил, что в response.text и response.body содержание html изменяется всякий раз, когда возвращается более одной страницы.Это не относится к response.data, который работает нормально.Почему это происходит?

Я пробовал это на том же коде (и веб-сайте), что и в документации - http://splash.readthedocs.io/en/stable/scripting-ref.html#splash-html (из более поздней части, из примера для нескольких снимков HTML)

Это мой запрос на всплеск ->

 yield Request(url= url, callback= self.parse, dont_filter=True, meta={
     'splash': {
          'args': {'lua_source': self.lua_source, 'timeout': 200},
          'endpoint': 'execute',
       },
 })

Сценарий lua выглядит следующим образом ->

function page_info(splash, url)
   splash:go(url)
   local res = {
     html=splash:html(),
     }
   return res
end

function main(splash, args)
   local base = "https://news.ycombinator.com/news?p="
   local result = treat.as_array({})
   for i=1,3 do
      local url =  base .. i
      result[i] = page_info(splash, url)
   end
   return result
end

Полученный ответ:

ответ.data ->

{u'html': u'<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">\n <link rel="shortcut icon" href="favicon.ico">\n <link rel="alternate" type="application/rss+xml" title="RSS" href="rss">\n <title>Hacker News</title>

response.text и response.body ->

 u'[{"html": "<html op=\\"news\\"><head><meta name=\\"referrer\\" content=\\"origin\\"><meta name=\\"viewport\\" content=\\"width=device-width, initial-scale=1.0\\"><link rel=\\"stylesheet\\" type=\\"text/css\\" href=\\"news.css?i7azI8MkFRPfcPhHQ7HD\\">\\n <link rel=\\"shortcut icon\\" href=\\"favicon.ico\\">\\n <link rel=\\"alternate\\" type=\\"application/rss+xml\\" title=\\"RSS\\" href=\\"rss\\">\\n <title>Hacker News</title></head>

Обратите внимание на дополнительные \ \ во втором случае.Это могут быть экранирующие символы или что-то в этом роде, но они связываются с LinkExtractor, который использует response.text и приводит к битым ссылкам.Опять же, это происходит только тогда, когда я возвращаю массив ответов HTML.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 10 июня 2018

Скрипт Lua возвращает массив результатов, который будет переведен в JSON-совместимую структуру в Python.Значение в response.text кажется правильным.

HTML-код, который вы хотите передать LinkExtractor, равен json.loads(response.text)[i]['html'], для i в 0..2.

In [1]: import json

In [2]: text = u'[{"html": "<html op=\\"news\\"><head><meta name=\\"referrer\\" content=\\"origin\\"><meta name=\\"viewport\\
   ...: " content=\\"width=device-width, initial-scale=1.0\\"><link rel=\\"stylesheet\\" type=\\"text/css\\" href=\\"news.css
   ...: ?i7azI8MkFRPfcPhHQ7HD\\">\\n <link rel=\\"shortcut icon\\" href=\\"favicon.ico\\">\\n <link rel=\\"alternate\\" type=
   ...: \\"application/rss+xml\\" title=\\"RSS\\" href=\\"rss\\">\\n <title>Hacker News</title></head>"}]'

In [3]: print(text)
[{"html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"}]

In [4]: print(json.dumps(json.loads(text), indent=2))
[
  {
    "html": "<html op=\"news\"><head><meta name=\"referrer\" content=\"origin\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><link rel=\"stylesheet\" type=\"text/css\" href=\"news.css?i7azI8MkFRPfcPhHQ7HD\">\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"rss\">\n <title>Hacker News</title></head>"
  }
]

In [5]: print(json.loads(text)[0]['html'])
<html op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?i7azI8MkFRPfcPhHQ7HD">
 <link rel="shortcut icon" href="favicon.ico">
 <link rel="alternate" type="application/rss+xml" title="RSS" href="rss">
 <title>Hacker News</title></head>
...