Как парсить html страничку с JavaScript в python 3?

225
30 июня 2018, 08:40

Как парсить html страничку с JavaScript в python 3 и что для этого нужно.

Answer 1

Чтобы достать статические данные из html, javascript текста, можно использовать соответствующие парсеры, такие как BeautifulSoup, slimit. Пример: Как, используя Beautuful Soup, искать по ключевому слову если это слово находится в теге script?

Чтобы получить информацию с web-странички, элементы которой javascript динамически генерирует, можно web-браузером воспользоваться. Чтобы управлять разными браузерами из Питона, selenium webdriver помогает: пример с показом GUI. Есть и другие библиотеки, к примеру: marionette (firefox), pyppeteer (chrome, puppeteer API для Питона) — пример получения снимка экрана с web-страницей с использованием этих библиотек. Чтобы получить html страницу, не показывая GUI, можно «безголовый» (headless) Google Chrome запустить и с использованием selenium:

from selenium import webdriver  # $ pip install selenium
options = webdriver.ChromeOptions()
options.add_argument('--headless')
# get chromedriver from 
# https://sites.google.com/a/chromium.org/chromedriver/downloads
browser = webdriver.Chrome(chrome_options=options)
browser.get('https://ru.stackoverflow.com/q/749943')
# ... other actions
generated_html = browser.page_source
browser.quit()

Этот интерфейс позволяет автоматизировать действия пользователя (нажатие клавиш, кнопок, поиск элементов на странице по различным критериям, итд). Анализ полезно на две части разбить: загрузить из сети динамически генерируемую информацию с помощью браузера и сохранить её (возможно наличие избыточной информации), а затем детально анализировать уже статическое содержимое, чтобы изъять только необходимые части (возможно без сети в другом процессе с помощью того же BeautifulSoup). К примеру, чтобы найти ссылки на похожие вопросы на сохранённой странице:

from bs4 import BeautifulSoup
soup = BeautifulSoup(generated_html, 'html.parser')
h = soup.find(id='h-related')
related = [a['href'] for a in h.find_all('a', 'question-hyperlink')]

Если сайт предоставляет API (официальное или подсмотренное в сетевых запросах выполняемых javascript), то это может быть более предпочтительным вариантом по сравнению с выдёргиванием информации c UI элементов web-страницы: пример, использования Stack Exchange API.

Часто можно встретить REST API или GraphQL API, которые удобно с помощью requests или специализированных библиотек использовать (по ссылкам примеры кода для github api).

READ ALSO
Не работают ссылки Wordpress

Не работают ссылки Wordpress

Через functionsphp вставил собственный блок с ссылкой

230
Не могу понять, для чего нужно использовать свойство box-sizing в CSS

Не могу понять, для чего нужно использовать свойство box-sizing в CSS

Всем здравствуйте! У меня такой вопрос, продолжил я изучение HTML/CSS, и я не могу понять, для чего вообще нужно применять свойство box-sizing для HTML-элементов...

187
В чем отличие в объединении селекторов в CSS

В чем отличие в объединении селекторов в CSS

Я пытаюсь разобраться в чем разница между выполнением трех разных типов селекторовТ

222
масштабирование картинки

масштабирование картинки

Есть картинки скажем 200х200, как сделать так, что бы при увеличении/уменьшении расширения она меняла свой размер пропорционально(пусть даже...

185