Таблица очистки экрана, очистка и загрузка в фрейм данных - PullRequest
0 голосов
/ 21 декабря 2018

Я экспериментировал с несколькими способами циклического перебора элементов TR и элементов TE и выяснил, как перебирать эти строки в таблице для импорта данных, которые я хотел получить.Затем я нашел еще более простой способ получить те же данные без использования цикла.Вот мой код.

from bs4 import BeautifulSoup
import requests
import pandas as pd            
url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data, "lxml")
table = soup.find_all('table')[0]
print(table.prettify())

Единственная проблема состоит в том, что данные поступают со всем форматированием HTML, как это.

<table id="holidayTable">
 <tr>
  <th class="left light" colspan="3">
   Holiday
  </th>
  <th class="left light">
   Markets Closed
  </th>
 </tr>
 <tr>
  <td class="bold left" valign="top">
   01/01/2018

Как я могу очистить эти данные и загрузить ихв кадр данных?Я хочу, чтобы это выглядело по существу следующим образом.

enter image description here

Спасибо, что нашли время взглянуть на это!

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Делая то же самое немного по-другому, вы можете проверить следующий подход.Используется [1:] в скрипте для удаления th значений.Я пытался избавиться от избыточности:

from bs4 import BeautifulSoup
import requests
import pandas as pd 

url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"

res = requests.get(url)
soup = BeautifulSoup(res.text, "lxml")
data = pd.DataFrame()

for rows in soup.find(id='holidayTable').find_all('tr')[1:]:
    tds = [row.text for row in rows.find_all('td')]
    add_list_to_df = pd.DataFrame([tds])
    data = data.append(add_list_to_df)

df = pd.DataFrame({"Header1":data[0],"Header2":data[1],"Header3":data[2],"Header4":data[3]}).to_string(index=False)
print(df)
0 голосов
/ 21 декабря 2018

Простым способом было бы сделать:

import pandas as pd

url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"

dfs = pd.read_html(url)
df = dfs[0]

Но это хороший пример для практики BeautifulSoup, так как он довольно чист с тегами.Вы нашли табличный тег, теперь вам просто нужно перебрать строки и поместить их в кадр данных.

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

results = pd.DataFrame()

Затем я нахожу все теги tr в таблице, которую вы сохранили:

rows = table.find_all('tr')

Далее для каждой строки я нахожу данные с тегом td и помещаю их всписок:

data = row.find_all('td')
row_data = [ x.text for x in data ]

Я помещаю это во временный фрейм данных, который я использую, чтобы добавить к исходному фрейму данных результатов:

temp_df = pd.DataFrame([row_data])
results = results.append(temp_df)

Затем в последний раз я сбрасываю нулевую строку и сбрасываю индекс,Я не знаю, какими должны быть столбцы, но вы можете переименовать столбцы в последней строке.Или заголовки столбцов обычно являются тегом th таблицы, вы всегда можете вернуться и получить их.

Полный код:

from bs4 import BeautifulSoup
import requests
import pandas as pd            
url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data, "lxml")
table = soup.find_all('table')[0]


results = pd.DataFrame()
rows = table.find_all('tr')
for row in rows:
    data = row.find_all('td')
    row_data = [ x.text for x in data ]
    temp_df = pd.DataFrame([row_data])

    results = results.append(temp_df)

results = results.dropna(how='all').reset_index(drop = True)
results.columns = ['col1', 'col2', 'col3', 'col4']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...