Python BeautifulSoup: получение элементов таблицы на основе атрибута цвета - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть HTML-код, который выглядит следующим образом (это представляет строки данных в таблице)

<tr bgcolor="#f4f4f4">
<td height="25" nowrap="NOWRAP">&nbsp;CME_ES&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;07:58:46&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;Connected&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;07:58:00&nbsp;</td>
<td height="25" nowrap="NOWRAP" bgcolor="#55aa2a">&nbsp;--:--:--&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;01:25:00 &nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp; 22:00:00&nbsp;</td>
</tr>
.
.
.
<tr bgcolor="#ffffff">
<td height="25" nowrap="NOWRAP">&nbsp;CME_NQ&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;07:58:46&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;Connected&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;191&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;07:58:01&nbsp;</td>
<td height="25" nowrap="NOWRAP" bgcolor="#55aa2a">&nbsp;--:--:--&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;0&nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp;01:25:00 &nbsp;</td>
<td height="25" nowrap="NOWRAP">&nbsp; 22:00:00&nbsp;</td>
</tr>

У меня есть код, который получает цвет из каждого набора данных:

mrkt_stat = []
for td in site.findAll('td'):
 if 'bgcolor' in td.attrs:
  mrkt_stat.append(td.attrs['bgcolor'])

Печать этого списка даст мне список всех цветов из каждой строки данных, что хорошо.

У меня также есть код, который будет получать данные строки из каждого набора данных:

data = []
for row in site.findAll('tr'):
 cols = row.find_all('td')
 cols = [ele.text.strip() for ele in cols]
 data.append([ele for ele in cols if ele])

Это также хорошо, и он возвращает список списков, где каждый подсписок представляет собой строку данных из таблицы, которую я собираю.

Однако я хочу добавить / объединить этот код, чтобы он только добавлял информациюк списку data , если шестнадцатеричный цветовой код в наборе строк равен '# 55aa2a'

EDIT: данные должны быть возвращены раздетыми, так как я ввожу возвращенный список в DataFrame панди этот DataFrame - это то, что будет представлено

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Отфильтруйте td в строках, используя параметр attrs={'tag': 'attr'} с site.find_all():

for row in site.find_all('tr'):
if row.find_all('td', attrs={'bgcolor': '#55aa2a'}):
    data.append([str(td.text.strip()) for td in row.find_all('td')])

, тогда список data должен содержать только те элементы с выбранным bgcolor:

>>> print(data)
[['CME_ES', '07:58:46', 'Connected', '0', '0', '0', '0', '07:58:00', '--:--:--', '0', '0', '01:25:00', '22:00:00'], 
 ['CME_NQ', '07:58:46', 'Connected', '0', '0', '191', '0', '07:58:01', '--:--:--', '0', '0', '01:25:00', '22:00:00']]
0 голосов
/ 28 ноября 2018

Вы можете сделать это в едином понимании вложенного списка:

data = [i.text for row in soup.find_all('tr') for i in row.find_all('td', {'bgcolor': '#55aa2a'})]

Возвращает:

['\xa0--:--:--\xa0', '\xa0--:--:--\xa0']
0 голосов
/ 28 ноября 2018

Попробуйте следующее

for row in site.findAll('tr'):
  if row.attrs['bgcolor'] != '#55aa2a': continue
  cols = row.find_all('td')
  data.append([ele.text.strip() for ele in cols if ele.text.strip()])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...