Парсинг таблицы с помощью BeautifulSoup4 + lxml

Есть таблица в которой есть данные. Как получить эти данные, используя BeautifulSoup и lxml?

Сам сайт

Структура таблицы:

<tr class="title"> 
  <td width="5%" height="20" align="center">
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=1">Позиция</a></td>
  <td width="5%" height="20" align="center">&nbsp;</td>
  <td width="55%" height="20" align="center">
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=6">Сайт</a></td>
  <td width="5%" height="20" align="center">
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=9">KG хиты</a></td>
  <td width="5%" height="20" align="center">
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=3">Хиты</a></td>
  <td width="5%" height="20" align="center">
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=4">Посетители</a></td>
  <td width="5%" align="center">    
   <a href="?cat=&amp;pp=20&amp;old_sort=1&amp;sort=1&amp;orient=desc&amp;sort=2">Хосты</a></td>
<!--
  <TD width="5%" align="center">
   <a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=7"><a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=7">ТиЦ</a></TD>
  <TD width="5%" align="center">
   <a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=8"><a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=8">Pr</a></TD>
//-->
  <td width="5%" height="20" align="center">&nbsp;</td>
 </tr>

Нужно получить структурированные данные:

  1. Позиций
  2. Сайтов
  3. Хитов
  4. Посетителей
  5. Хостов

Ответы (1 шт):

Автор решения: gil9red

Накидал простенький парсер:

  • Использование встроенного html.parser вместо lxml. Для lxml заменить на BeautifulSoup(rs.content, 'lxml')
  • Поиск таблицы
  • Перебор строк таблицы -- <tr>
  • Перебор ячеек каждой строки таблицы -- <td>
  • Обработка <td>
  • Сбор результата в список из кортежей

Пример:

from bs4 import BeautifulSoup
import requests

def get_text(tag):
    if not tag:
        return ''

    return tag.get_text(strip=True)

rs = requests.get('https://www.net.kg/')
root = BeautifulSoup(rs.content, 'html.parser')

table = root.select_one('#main_block > table:nth-child(27)')

items = []

for tr in table.select('tr'):
    td_list = tr.select('td')
    if not td_list:
        continue

    pos, _, site, kg_hits, hits, visitors, hosts, _ = td_list
    if not site.a.has_attr('title'):
        continue

    items.append(
        (get_text(pos), site.a['title'], get_text(kg_hits),
         get_text(hits), get_text(visitors), get_text(hosts))
    )

print(items)
# [('1', 'http://mashina.kg', '425065(+17510)', '487000(+21691)', '38624(+1355)', '12222(+140)'),
#  ('2', 'http://diesel.elcat.kg', '343306(-18716)', '362302(-22870)', '28062(-630)', '14393(-439)'),
#  ...
→ Ссылка