красивый суп фиксирует нулевые значения в таблице

Для следующего фрагмента HTML-кода я использовал BeautifulSoup для захвата табличной информации:

<table>
<tr>
<td><b>Code</b></td>
<td><b>Display</b></td>
</tr>
<tr>
<td>min</td>
<td>Minute</td><td/>
</tr>
<tr>
<td>happy </td>
<td>Hour</td><td/>
</tr>
<tr>
<td>daily </td>
<td>Day</td><td/>
</tr>

Это мой код:

comments = [td.get_text()  for td in table.findAll("td")]
Comments=[data.encode('utf-8')  for data in comments] 

Как видите, у этой таблицы есть два заголовка: «код и отображение» и некоторые значения в строках. Ожидаемый результат моего кода должен быть [код, дисплей, мин, минуты, счастливый, час, ежедневно, день]

но это выход:

['Code', 'Display', 'min', 'Minute', '', 'happy ', 
'Hour', '', 'daily ', 'Day', '']

Вывод имеет '' в 5-м, 8-м и 11-м индексах в комментариях, которые не определены в этой таблице. Я думаю, что это может быть из-за </td><td/>. Как я могу изменить код, чтобы он не захватывал u'' на выходе?


person Mary    schedule 31.05.2016    source источник
comment
@ Ноа, моя проблема не в "ты". Это u'' в списке вывода. После того, как я преобразовал код в строку, используя следующий код: «Comments=[data.encode('utf-8') для данных в комментариях]», это вывод: ['Code', 'Display', 'min' , 'Минута', '', 'счастливый', 'Час', '', 'ежедневно', 'День', ''] , вы видите дополнительный вывод в 5-м и 10-м индексах?   -  person Mary    schedule 01.06.2016


Ответы (1)


Извините, я недостаточно внимательно прочитал ваш вопрос. Вы правы, проблема в пустых тегах <td/>. Просто настройте свой генератор так, чтобы он включал только ячейки с текстом:

comments = [td.get_text() for td in table.findAll('td') if td.text]


РЕДАКТИРОВАТЬ: я сомневаюсь, что это самый эффективный способ сделать это, но это будет включать только td, у которых есть либо текст, либо соответствующий td в первой строке.

ths = table.tr.find_all('td')
tds_in_row = len(table.tr.next_sibling.find_all('td'))

tds = [
    td.get_text()
    for i, td in enumerate(table.find_all('td'))
    if len(ths) > (i + 1) % tds_in_row or td.text
]
person Noah    schedule 01.06.2016
comment
Большое спасибо ! - person Mary; 01.06.2016
comment
Извините, Ной, вы можете дать мне другое решение? Потому что, если я использую предложенный вами код, он не будет захватывать некоторые нулевые значения (например, для отображения в других таблицах), которые я действительно хочу их зафиксировать. как вы думаете, я могу удалить ‹td/› из тегов таблицы? - person Mary; 01.06.2016
comment
Можете ли вы привести примеры, когда вы хотели бы и не хотели бы сохранить ценности? - person Noah; 01.06.2016
comment
например, в следующем URL-адресе столбец определения таблицы в разделе логического определения содержимого имеет нулевые значения. hl7.org/fhir/valueset-contract-term-type.html Но для следующего URL: hl7.org/fhir/valueset-age -units.html Таблица (в разделе логического определения содержимого) возвращает нулевые значения, хотя в таблице не определен столбец, содержащий нулевое значение. Спасибо большое за вашу помощь ! - person Mary; 01.06.2016
comment
Большое спасибо ! Для этой части вашего кода tds_in_row = len(table.tr.next_sibling.find_all('td')), это ошибка: объект "NavigableString" не имеет атрибута "find_all" - person Mary; 03.06.2016
comment
@Mary Возможно, в строке вашей таблицы появляются символы новой строки ('\n'). Либо убедитесь, что таблица не содержит разрывов строк, либо используйте find_next_sibling('tr') вместо next_sibling. - person Noah; 03.06.2016