Pandas выводит странно отформатированный фрейм данных

Когда я запускаю это, он выводит странный фрейм данных, говоря, что столбцы отсутствуют и т. д. Хотя я вижу столбцы в файле html.

import pandas as pd
from bs4 import BeautifulSoup
import lxml.html as lh

with open("htmltabletest.html", encoding = "utf-8") as f:
    data = f.read()
    soup = BeautifulSoup(data, 'lxml')

    dfs = pd.read_html(soup.prettify())
    for df in dfs:
        print(df)

Это выводит это:

   Unnamed: 0           ...                      Price  range
0         NaN           ...            $134.50  to  $2,222.50
1         NaN           ...             $20.39  to  $3,602.50

[2 rows x 5 columns]

Когда у меня это как htmltabletest.html:

<table class = "dataTable st-alternateRows" id = "eventSearchTable">
<thead>
<tr>
<th id = "th-es-rb"><div class = "dt-th"> </div></th>
<th id = "th-es-ed"><div class = "dt-th"><span class = "th-divider"> </span>Event date<br/>Time (local)</div></th>
<th id = "th-es-en"><div class = "dt-th"><span class = "th-divider"> </span>Event name<br/>Venue</div></th>
<th id = "th-es-ti"><div class = "dt-th"><span class = "th-divider"> </span>Tickets<br/>listed</div></th>
<th id = "th-es-pr"><div class = "dt-th es-lastCell"><span class = "th-divider"> </span>Price<br/>range</div></th>
</tr>
</thead>
<tbody class = "" id = "eventSearchTbody"><tr class = "even" id = "r-se-103577924">
<td class = "nowrap"><input class = "es-selectedEvent" id = "se-103577924-check" name = "selectEvent" type = "radio"/></td>
<td class = "nowrap" id = "se-103577924-eventDateTime">Thu, 10/11/2018<br/>8:20 p.m.</td>
<td><div><a class = "ellip" href = "services/priceanalysis?eventId=103577924&amp;sectionId=0" id = "se-103577924-eventName" target = "_blank">Philadelphia Eagles at New York Giants</a></div><div id = "se-103577924-venue">MetLife Stadium, East Rutherford, NJ</div></td>
<td id = "se-103577924-nrTickets">6655</td>
<td class = "es-lastCell nowrap" id = "se-103577924-priceRange"><span id = "se-103577924-minPrice">$134.50</span>  to<br/><span id = "se-103577924-maxPrice">$2,222.50</span></td>
</tr><tr class = "odd" id = "r-se-103577925">
<td class = "nowrap"><input class = "es-selectedEvent" id = "se-103577925-check" name = "selectEvent" type = "radio"/></td>
<td class = "nowrap" id = "se-103577925-eventDateTime">Thu, 10/11/2018<br/>8:21 p.m.</td>
<td><div><a class = "ellip" href = "services/priceanalysis?eventId=103577925&amp;sectionId=0" id = "se-103577925-eventName" target = "_blank">PARKING PASSES ONLY Philadelphia Eagles at New York Giants</a></div><div id = "se-103577925-venue">MetLife Stadium Parking Lots, East Rutherford, NJ</div></td>
<td id = "se-103577925-nrTickets">929</td>
<td class = "es-lastCell nowrap" id = "se-103577925-priceRange"><span id = "se-103577925-minPrice">$20.39</span>  to<br/><span id = "se-103577925-maxPrice">$3,602.50</span></td>
</tr></tbody>
</table>
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
54
3

Ответы 3

Я запустил ваш код, и печать в порядке. Но вы также должны попробовать display(df).

<tr>
<th id = "th-es-rb"><div class = "dt-th"> </div></th>
<th id = "th-es-ed"><div class = "dt-th"><span class = "th-divider"> </span>Event date<br/>Time (local)</div></th>
<th id = "th-es-en"><div class = "dt-th"><span class = "th-divider"> </span>Event name<br/>Venue</div></th>
<th id = "th-es-ti"><div class = "dt-th"><span class = "th-divider"> </span>Tickets<br/>listed</div></th>
<th id = "th-es-pr"><div class = "dt-th es-lastCell"><span class = "th-divider"> </span>Price<br/>range</div></th>
</tr>

Ваша программа работает нормально. Обратите внимание, что в строке:

<th id = "th-es-rb"><div class = "dt-th"> </div></th>

у вас нет никаких ценностей. Если вы измените свой ввод на напр.

<th id = "th-es-rb"><div class = "dt-th"> My new column </div></th>

Это сработало бы нормально.

МОЙ ВЫХОД:

In [146]: df.columns

Out[146]: 
Index(['My new cole', 'Event date  Time (local)', 'Event name  Venue',
       'Tickets  listed', 'Price  range'],
      dtype='object')

В [145]: df

Out[145]: 
   My new cole    Event date  Time (local)  \
0          NaN  Thu, 10/11/2018  8:20 p.m.   
1          NaN  Thu, 10/11/2018  8:21 p.m.   
                                   Event name  Venue  Tickets  listed  \
0  Philadelphia Eagles at New York Giants  MetLif...             6655   
1  PARKING PASSES ONLY Philadelphia Eagles at New...              929   
             Price  range  
0  $134.50  to  $2,222.50  
1   $20.39  to  $3,602.50  

Тогда почему мой вывод не включает остальные столбцы и данные? Должно быть еще 3 столбца, например Event name, вместе с названием события в первой строке? Он не должен печатать NaN.

Sparkflight 26.08.2018 00:49

В моем случае ответ заключался в том, что я использую IDLE вместо pycharm или что-то еще для запуска программы. По умолчанию pandas печатается недостаточно широко, чтобы уместить мои данные. На это уже был дан ответ в здесь

Другие вопросы по теме