Парсинг таблицы с помощью BeautifulSoup4 + lxml
Есть таблица в которой есть данные. Как получить эти данные, используя BeautifulSoup и lxml?
Структура таблицы:
<tr class="title">
<td width="5%" height="20" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=1">Позиция</a></td>
<td width="5%" height="20" align="center"> </td>
<td width="55%" height="20" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=6">Сайт</a></td>
<td width="5%" height="20" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=9">KG хиты</a></td>
<td width="5%" height="20" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=3">Хиты</a></td>
<td width="5%" height="20" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&sort=4">Посетители</a></td>
<td width="5%" align="center">
<a href="?cat=&pp=20&old_sort=1&sort=1&orient=desc&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"> </td>
</tr>
Нужно получить структурированные данные:
- Позиций
- Сайтов
- Хитов
- Посетителей
- Хостов
Ответы (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)'),
# ...