Понадобилось распарсить сайт хецнера для 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