Как получить доступ к одному из классов HTML, используя read_html в Pandas? - PullRequest
0 голосов
/ 04 июля 2019

Я хочу, чтобы один класс с именем "metricbar" из HTML не использовался, а остальные должны преобразовываться в отчет CSV.

Используя Панд, я могу читать HTML, но не могу удалить это calss (метрическая полоса). Подскажите, пожалуйста, как мне удалить этот класс при чтении HTML?

1 Ответ

0 голосов
/ 04 июля 2019

Я бы сделал это с красивым супом:

import bs4

# create a fragment of html code with a table that has class='metricbar'
html="""<div class="row box-bg"><div class="col-xs-12"><!--LeftColumn_4--><div class="box" id=""><h3 class="box-headline" id="">Kennzahlen Alphabet A (ex Google) Aktie</h3><div class="spacer-10"></div><div class="table-responsive"><table class="metricbar"><colgroup><col width="35%"><col><col><col><col><col><col></colgroup><thead><tr><th></th><th><div class="pull-left mright-5">2017</div></th><th>2018e</th><th>2019e</th><th>2020e</th><th>2021e</th><th>2022e</th></tr></thead><tbody><tr><td class="font-bold">Dividende</td><td>0,00</td><td>0,00</td><td>0,00</td><td>0,00</td><td>0,00</td><td>-</td></tr><tr><td class="font-bold">Dividendenrendite (in %)</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td></tr><tr><td class="font-bold">Ergebnis/Aktie</td><td>35,90</td><td>41,74</td><td>46,18</td><td>53,05</td><td>61,32</td><td>72,52</td></tr><tr><td class="font-bold">KGV</td><td>29,51</td><td>26,75</td><td>23,67</td><td>20,61</td><td>17,83</td><td>15,07</td></tr></tbody></table></div><div>Geschäftsjahresende: 31. Dezember</div></div><!--LeftColumn_5--><div class="box"><div class="table-responsive"><table class="table"><colgroup><col width="35%"><col width="15%"><col width="35%"><col width="15%"></colgroup><tbody><tr><td class="font-bold">Marktkapitalisierung in Mrd. EUR</td><td>645,56</td><td class="font-bold">Anzahl Aktien in Mio.</td><td>299,44</td></tr><tr><td class="font-bold">Streubesitz %</td><td>0,00</td><td class="font-bold">Gewinn/Aktie</td><td>35,90</td></tr><tr><td class="font-bold"><div title="Kurs/Buchwert Verhältnis">KBV</div></td><td>4,83</td><td class="font-bold">Buchwert/Aktie</td><td>219,55</td></tr><tr><td class="font-bold"><div title="Kurs/Cashflow Verhältnis">KCV</div></td><td>27,35</td><td class="font-bold">Cashflow/Aktie</td><td>38,73</td></tr><tr><td class="font-bold"><div title="Kurs/Gewinn Verhältnis">KGV</div></td><td>29,51</td><td class="font-bold">Emissionspreis </td><td></td></tr><tr><td class="font-bold">30 Tage Vola</td><td>21,26</td><td class="font-bold">90 Tage Vola</td><td>30,43</td></tr><tr><td class="font-bold">180 Tage Vola</td><td>26,18</td><td class="font-bold">250 Tage Vola</td><td>26,81</td></tr></tbody></table></div><div class="spacer-5"></div><div class="row more-link-list"><div class="col-sm-3 col-xs-6"><a href="/dividende/alphabet_a">Dividendenübersicht</a></div><div class="col-sm-3 col-xs-6"><a href="/bilanz_guv/alphabet_a">historische Bilanz</a></div><div class="col-sm-3 col-xs-6"><a href="/schaetzungen/alphabet_a">Schätzungen</a></div></div></div></div></div><div class="spacer-20" id="">"""

# setup the html parser
soup= bs4.BeautifulSoup(html, 'lxml')

# the search all tables and print their count (it should be 2)
print(len(soup.find_all('table')))
# now search for all tags which have class='metricbar'
# no matter what the tag name is
for piece in soup.find_all(attrs={'class': 'metricbar'}):
    # remove them from the html source
    piece.extract()
# now load the tables from the resulting html code    
df= pd.read_html(str(soup))

Если вы хотите ограничить фильтрацию метрической таблицы таблицами, то есть просто отбросить таблицы с метрической строкой, вам просто нужно заменить строку for на:

for piece in soup.find_all(name='table', attrs={'class': 'metricbar'}):
...