пятница, 28 октября 2022 г.

Парсинг сайтов через python+bs4

 Понадобилось распарсить сайт хецнера для netbox, выбор пал на python+bs4

from bs4 import BeautifulSoup

import requests

Подключение, парсинг
 >>> r = requests.get('https://robot.hetzner.com/server/index/page/'+str(page), cookies=cookies)
>>> parsed = BeautifulSoup(page, "html.parser")

А теперь сами запросы

>>> print(parsed.head.title)

<title>Hetzner Online GmbH - Robot</title>

Вроде, несложно. Глянем заголовки meta

>>> print(parsed.head.meta)

<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>

И.. всё? Бага, их там много. Но нужно запросить через find_all

>>> parsed.find_all('meta')

Выберет меты по всей доке и выдаст массивом. Также, можно например так найти див с классом box_wide

>>> servers = parsed.findAll('div', class_='box_wide')

Можно запросить поле из тэга, например - итог запроса выше присвоили переменной и дальше через for server in servers при такой записи тэга <div class="box_wide" id="555">

>>> server.get('id')

будет 555
Далее, есть такая конструкция
              <td class="title server_article">
               <span class="tooltip_underline jquery-tooltip" tooltip="This server includes unlimited traffic.">
                PX61-SSD #555
               </span>
значение "внутри" тэгов span читается через .string (или .text), например так
server.find('td', class_='server_name').find('span').string

Есть ещё такой вариант
server.find_all('span', class_='tooltip_underline jquery-tooltip')

но в данном случае будет 3 таких поля и нужно выделить нужный номер

Вообще, таблички лучше парсить через тот же pandas или на худой конец HTMLTableParser

Также, можно извратиться так
>>> parsed.find_all('table')[3].tr.td.span.string
и это даже будет работать, но читаемость - сами понимаете. Ну и чуть изменят поля и привет, поэтому лучше find_all (или findAll, что одно и то же)

links
https://www.crummy.com/software/BeautifulSoup/bs4/doc/ - тут есть всё нужное, но читать - много.


Комментариев нет:

Отправить комментарий