Selenium - Почему значение driver.page_source корректно анализируется только при записи в файл? - PullRequest
0 голосов
/ 21 марта 2020

Используя Python, я хотел бы получить полный код HTML от reddit.com для поиска строк, однако я могу получить только странную маленькую версию. Код в операторе if ниже не выполняется , но должен работать, потому что я знаю, что строка существует в источнике полной страницы (строка найдена как в инструментах разработчика браузера, так и в функции браузера «Просмотр источника страницы»):

driver = webdriver.Firefox()
driver.get('https://www.reddit.com')
driver.add_cookie({'name':'reddit_session', 'value':'###session cookie value goes here###', 'path':'/', 'domain':'reddit.com'})
driver.refresh() # refresh the page to apply the cookie
source_html = driver.page_source

if 'user account' in source_html:
  print("String found.")

driver.close()

Вот sourceHTML копия и вставка в файл. Его длина составляет 65 536 байт и не имеет смысла.

Что делает запись содержимого переменной в файл:

driver = webdriver.Firefox()
driver.get('https://www.reddit.com')
driver.add_cookie({'name':'reddit_session', 'value':'###session cookie value goes here###', 'path':'/', 'domain':'reddit.com'})
driver.refresh() # refresh the page to apply the cookie
source_html = driver.page_source

with open('page.html', 'w') as myfile:
   myfile.write(source_html)

driver.close()

А вот 580 000 байтов HTML, которые, как я ожидаю, были записаны в файл.

Мне нужно иметь возможность искать в этом HTML в пределах Python и не создавать файл.

Я безуспешно пытался выполнить следующие действия:

  • Во время отладки скопировал строку, возвращенную из driver.page_source, вставил ее в блокнот и сохранил в виде файла. html.
  • Использование BeautifulSoup для анализа переменной sourceHtml.
  • Выполнение Javascript для получения всего DOM: getDOM = driver.execute_script('return document.documentElement.outerHTML')
  • Использование time.sleep(5) для ожидания окончания страницы sh загрузка перед запуском driver.page_source (хотя Webdriver все равно ждет полного ответа, прежде чем перезвонить).

Заранее большое спасибо.

1 Ответ

0 голосов
/ 21 марта 2020

Я обнаружил проблему.

Копирование значения переменной в режиме отладки не дает полного значения.

Строка в моем операторе if была также означало, что « U учетная запись ser» не « u учетная запись ser», поэтому она оценивалась как false.

Когда я сохранял значение переменной через режим отладки в виде файла html, это была часть того, что фактически содержала переменная. Предел этих значений переменных отладки варьируется в зависимости от среды разработки (Netbeans, Eclipse, VS Code и т. Д. c). В VS Code он составляет 65 536 байт (2 ^ 16).

Я оставил этот следующий шаг в покое, но если вы хотите изменить предел размера отладочной переменной, я думаю, что есть ключ: значение 'что вы добавляете в файл launch.json (в зависимости от того, на каком языке вы отлаживаете). Вот как это сделать для PHP.

Файл launch.json применяет настройки при запуске в режиме отладки. В этом файле есть синяя кнопка «Добавить конфигурацию ...». В нем будут перечислены все настройки, которые вы можете применить к файлу.

...