Извлечь таблицу из сети - PullRequest
0 голосов
/ 19 декабря 2018

необходимо извлечь данные из <a href="#">Data</a> из url ниже.Любая подсказка, как извлечь эту таблицу в DataFrames?

from bs4 import BeautifulSoup
import requests

url = 'https://docs.google.com/spreadsheets/d/1dgOdlUEq6_V55OHZCxz5BG_0uoghJTeA6f83br5peNs/pub?range=A1:D70&gid=1&output=html#'

r = requests.get(url)
html_doc = r.text
soup = BeautifulSoup(html_doc, features='html.parser')

#print(soup.prettify())
print(soup.title)

Ответы [ 3 ]

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

Может быть проще начать с многомерного списка, а затем перенести его в DataFrame, чтобы мы не предполагали размеры.Гиперссылка «Данные» ссылается на div id = 0, поэтому мы выбираем все элементы в нем, а затем анализируем каждый столбец в каждой строке в массив списка (в котором я называю elements ), который добавляется к массиву полного списка (который я называю fullelements ) и сбрасывается для каждой новой строки.

from bs4 import BeautifulSoup
import pandas as pd
import requests

url = 'https://docs.google.com/spreadsheets/d/1dgOdlUEq6_V55OHZCxz5BG_0uoghJTeA6f83br5peNs/pub?range=A1:D70&gid=1&output=html#'

r = requests.get(url)
html_doc = r.text
soup = BeautifulSoup(html_doc, features='html.parser')

#print(soup.prettify())
print(soup.title.text)
datadiv=soup.find("div", {"id": "0"})
elementsfull =[]
row=0
for tr in datadiv.findAll("tr"):
    elements=[]
    column=0
    for td in tr.findAll("td"):
        if(td.text!=''):
            elements.append(td.text)
            column+=1
            #print('column: ', column)   

    elementsfull.append(elements)        
    #print('row: ', row)        
    row+=1

mydf = pd.DataFrame(data=elementsfull)
print(mydf)

Я проверил этот код и проверил его по таблице, поэтому ягарантировать, что это работает.

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

Вы можете прочитать_html и обработать фрейм данных как требуется

import pandas as pd
results = pd.read_html('https://docs.google.com/spreadsheets/d/1dgOdlUEq6_V55OHZCxz5BG_0uoghJTeA6f83br5peNs/pub?range=A1:D70&gid=1&output=html#')
result = results[0].dropna(how='all')
del result[0]
result.dropna(axis='columns', how='all', inplace=True)
result.to_csv(r'C:\Users\User\Desktop\Data.csv', sep=',', encoding='utf_8_sig',index = False, header=None)
0 голосов
/ 19 декабря 2018
import bs4 as bs
import requests
import pandas as pd

url = 'https://docs.google.com/spreadsheets/d/1dgOdlUEq6_V55OHZCxz5BG_0uoghJTeA6f83br5peNs/pub?range=A1:D70&gid=1&output=html#'

r = requests.get(url)
html_doc = r.text
soup = bs.BeautifulSoup(html_doc, features='html.parser')

table = soup.find('table', attrs={'class':'subs noBorders evenRows'})
table_rows = soup.find_all('tr')

list1 = []
for tr in table_rows:
    td = tr.find_all('td')
    row = [tr.text for tr in td]
    list1.append(row)

df=pd.DataFrame(list1)    
df.columns =  df.iloc[1]
#starting from this point,it's just how you want to clean and slice the data
df = df.iloc[3:263]  #check the data to see if you want to only read these
df.dropna(axis='columns', how='all', inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...