BS4 парсинг html

Рейтинг: 0Ответов: 1Опубликовано: 10.06.2023

Помогите спарсить информацию в ячейках следующего html кода:

<tr style="font-weight:bold;">
    <td width="450px" style="border-top:2px solid black;font-weight:bold;cursor:pointer;" r="79" c="0" onclick="ExpandCollapseRows('tblProstoy', 80, 21, 79)"><span style="color:#8080FF">[-]</span>&nbsp;Список 3</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;font-weight:bold;" r="79" c="1"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;font-weight:bold;" r="79" c="2">Время 1</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;font-weight:bold;" r="79" c="3"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;font-weight:bold;" r="79" c="4">Время 2</td>
    <td style="text-align:center;border-top:2px solid black;font-weight:bold;" r="79" c="5">Общее время</td>
</tr>
<tr l="1">
    <td style="padding-left:16px;border-top:2px solid black;cursor:pointer;" width="450px" r="80" c="0" onclick="ExpandCollapseRows('tblProstoy', 81, 20, 80)"><span style="color:#8080FF">[-]</span>&nbsp;Внутри списка</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;" r="80" c="1"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;" r="80" c="2">Время 1</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;" r="80" c="3"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;" r="80" c="4">Время 2</td>
    <td style="text-align:center;border-top:2px solid black;" r="80" c="5">Общее время</td>
</tr>
<tr style="font-size:8pt;" l="2">
    <td style="padding-left:32px;border-top:1px solid black;" width="450px" valign="top" r="81" c="0">Текст который нужен</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="1">19:00 - 19:30</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="2">00:30</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="3"></td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="4"></td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="5">00:30</td>
</tr>
<tr style="font-size:8pt;" l="2">
    <td style="padding-left:32px;" width="450px" valign="top" r="82" c="0">Текст который нужен</td>
    <td style="text-align:center;" valign="top" r="82" c="1">19:41 - 19:53</td>
    <td style="text-align:center;" valign="top" r="82" c="2">00:12</td>
    <td style="text-align:center;" valign="top" r="82" c="3"></td>
    <td style="text-align:center;" valign="top" r="82" c="4"></td>
    <td style="text-align:center;" valign="top" r="82" c="5">00:12</td>
</tr>

Мой код на Python:

# импортируем необходимые библиотеки
import requests
from bs4 import BeautifulSoup

# указываем URL и учетные данные (если требуются)
url = 'сайт'
auth_data = ('логин', 'пароль')

# отправляем запрос на сервер и получаем содержимое страницы
response = requests.get(url, auth=auth_data)
soup = BeautifulSoup(response.content, 'html.parser')

# находим таблицу с идентификатором "tblProstoy"
table = soup.find('table', {'id': 'tblProstoy'})

# находим все строки со стилем 'font-weight:bold;'
rowtesc = table.find_all('tr', {'style': 'font-weight:bold;'})

# выбираем третью строку из rowtesc и находим все следующие строки со стилем 'font-size:8pt;' и атрибутом 'l' равным '2'
rowust = rowtesc[2].find_all_next('tr', {'style': 'font-size:8pt;', 'l': '2'})

# находим все ячейки со стилем 'padding-left:32px;' в каждой из строк
grad = [row.find_all('td', {'style': 'padding-left:32px;'}) for row in rowust]

# выводим результат
print(grad)

Если вывести rowtesc[2], то все находит верно, начиная с rowust выводит []. Подскажите в чем проблема?

Ответы

▲ 0
from bs4 import BeautifulSoup as Soup
h = """<tr style="font-weight:bold;">
    <td width="450px" style="border-top:2px solid black;font-weight:bold;cursor:pointer;" r="79" c="0" onclick="ExpandCollapseRows('tblProstoy', 80, 21, 79)"><span style="color:#8080FF">[-]</span>&nbsp;Список 3</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;font-weight:bold;" r="79" c="1"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;font-weight:bold;" r="79" c="2">Время 1</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;font-weight:bold;" r="79" c="3"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;font-weight:bold;" r="79" c="4">Время 2</td>
    <td style="text-align:center;border-top:2px solid black;font-weight:bold;" r="79" c="5">Общее время</td>
</tr>
<tr l="1">
    <td style="padding-left:16px;border-top:2px solid black;cursor:pointer;" width="450px" r="80" c="0" onclick="ExpandCollapseRows('tblProstoy', 81, 20, 80)"><span style="color:#8080FF">[-]</span>&nbsp;Внутри списка</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;" r="80" c="1"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;" r="80" c="2">Время 1</td>
    <td style="text-align:center;border-right:none;border-top:2px solid black;" r="80" c="3"></td>
    <td style="text-align:center;border-left:none;border-top:2px solid black;" r="80" c="4">Время 2</td>
    <td style="text-align:center;border-top:2px solid black;" r="80" c="5">Общее время</td>
</tr>
<tr style="font-size:8pt;" l="2">
    <td style="padding-left:32px;border-top:1px solid black;" width="450px" valign="top" r="81" c="0">Текст который нужен</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="1">19:00 - 19:30</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="2">00:30</td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="3"></td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="4"></td>
    <td style="text-align:center;border-top:1px solid black;" valign="top" r="81" c="5">00:30</td>
</tr>
<tr style="font-size:8pt;" l="2">
    <td style="padding-left:32px;" width="450px" valign="top" r="82" c="0">Текст который нужен</td>
    <td style="text-align:center;" valign="top" r="82" c="1">19:41 - 19:53</td>
    <td style="text-align:center;" valign="top" r="82" c="2">00:12</td>
    <td style="text-align:center;" valign="top" r="82" c="3"></td>
    <td style="text-align:center;" valign="top" r="82" c="4"></td>
    <td style="text-align:center;" valign="top" r="82" c="5">00:12</td>
</tr>"""

soup = Soup(h, 'html.parser')

for item in soup.select('tr[l="2"] > td[c="0"]'):
    print(item.get_text(strip=True))

Текст который нужен
Текст который нужен

Относительно ошибки в Вашем коде сказать что либо затрудняюсь, поскольку style="font-weight:bold;" имеет только один элемент tr в представленном Вами коде, и даже если предположить, что rowtesc = table.find_all('tr', {'style': 'font-weight:bold;'}) его находит, то он неможет иметь идекс 2 он будет иметь индекс 0. Поэтому Ваше утверждение Если вывести rowtesc[2], то все находит верно наводит на мысль, что Вы добавили в вопрос некорректный кусок html