Как захватить таблицу с веб-сайта в фрейм данных pandas

#python #pandas #dataframe #beautifulsoup #string-formatting

#python #pandas #фрейм данных #beautifulsoup #форматирование строки

Вопрос:

Я хочу захватить данные из таблицы, указанной на веб-сайте, и сохранить их в фрейме данных Pandas с предопределенными столбцами. Я пытался захватить то же самое, но я не могу разделить данные по столбцам. Ниже приведена моя попытка сделать это;

 import pandas as pd
import lxml.html as lh    
site= 'https://gadgets.ndtv.com/mobiles/guide/phone-under-10000-best-mobile-india-price-realme-redmi-samsung-vivo-camera-battery-2240177'
    docc= lh.fromstring((requests.get(site)).content)
    tr_= docc.xpath('//tr')
    df = pd.DataFrame(columns=['Phones', 'rating (out of 10)', 'Price in India'])
    for t in range(0,len(tr_)):
        row= tr_[t]
        for (value) in row.iterdescendants():
            phone= (value.text)
            #print(phone)
            dataset = df.append({'Phones':str(phone)},ignore_index=True)
  

Но здесь я не могу получить данные для «Телефонов», «рейтинг (из 10)» и «Цена в Индии»

Комментарии:

1. Для этого конкретного случая проще просто скопировать таблицу и вставить ее в Excel. Он сохраняет формат, а затем вы можете сохранить его и импортировать с помощью pandas.

Ответ №1:

 import requests
import pandas as pd


def main(url):
    r = requests.get(url)
    df = pd.read_html(r.content)[0]
    print(df)
    df.to_csv("data.csv")


main("https://gadgets.ndtv.com/mobiles/guide/phone-under-10000-best-mobile-india-price-realme-redmi-samsung-vivo-camera-battery-2240177")
  

Вывод:

   Phones under Rs. 10,000  Gadgets 360 rating (out of 10) Price in India (as recommended)
0               Realme C3                               8                       Rs. 7,999    
1        Realme Narzo 10A                               8                       Rs. 8,499    
2                 Redmi 8                               7                       Rs. 9,499    
3                Realme 5                               8                       Rs. 9,999    
4                Vivo U10                               7                       Rs. 9,990    
5               Realme U1                               8                       Rs. 8,499    
6      Samsung Galaxy M30                               8                      Rs. 10,035 
  

Комментарии:

1. Кажется простым решением для запроса.. Но мне нужно поделиться тем же результатом в фрейме данных, созданном в моем коде. ( df = pd.DataFrame(столбцы =[‘Телефоны’, ‘рейтинг (из 10)’, ‘Цена в Индии’])