Ubah data ke DataFrame dengan python

Dec 08 2020

Dengan bantuan @JaSON, berikut kode yang memungkinkan saya mendapatkan data di tabel dari html lokal dan kodenya menggunakan selenium

from selenium import webdriver

driver = webdriver.Chrome("C:/chromedriver.exe")
driver.get('file:///C:/Users/Future/Desktop/local.html')
counter = len(driver.find_elements_by_id("Section3"))
xpath = "//div[@id='Section3']/following-sibling::div[count(preceding-sibling::div[@id='Section3'])={0} and count(following-sibling::div[@id='Section3'])={1}]"
print(counter)

for i in range(counter):
    print('\nRow #{} \n'.format(i + 1))
    _xpath = xpath.format(i + 1, counter - (i + 1))
    cells = driver.find_elements_by_xpath(_xpath)
    for cell in cells:
         value = cell.find_element_by_xpath(".//td").text
         print(value)

Bagaimana baris ini diubah menjadi tabel valid yang dapat saya ekspor ke file csv? Berikut link HTML lokalhttps://pastebin.com/raw/hEq8K75C

** @Paul Brennan: Setelah mencoba mengedit penghitung menjadi counter-1saya mendapat 17 baris untuk melewati kesalahan baris 18 sementara, saya mendapat nama file.txt dan inilah snapshot dari output

Jawaban

1 PaulBrennan Dec 08 2020 at 19:56

Saya telah memodifikasi kode Anda untuk melakukan keluaran sederhana. Ini tidak terlalu pythonic karena tidak menggunakan pembuatan Dataframe vektor, tapi inilah cara kerjanya. Pertama, siapkan panda, kedua, buat kerangka data (tapi kami belum tahu kolomnya), lalu siapkan kolom pada lintasan pertama (ini akan menyebabkan masalah jika ada panjang kolom yang bervariasi Kemudian masukkan nilai ke dalam kerangka data

import pandas as pd
from selenium import webdriver

driver = webdriver.Chrome("C:/chromedriver.exe")
driver.get('file:///C:/Users/Future/Desktop/local.html')
counter = len(driver.find_elements_by_id("Section3"))
xpath = "//div[@id='Section3']/following-sibling::div[count(preceding-sibling::div[@id='Section3'])={0} and count(following-sibling::div[@id='Section3'])={1}]"
print(counter)

df = pd.Dataframe()

for i in range(counter):
    print('\nRow #{} \n'.format(i + 1))
    _xpath = xpath.format(i + 1, counter - (i + 1))
    cells = driver.find_elements_by_xpath(_xpath)
    if i == 0:
        df = pd.DataFrame(columns=cells) # fill the dataframe with the column names
    for cell in cells:
        value = cell.find_element_by_xpath(".//td").text
        #print(value)
        if not value:  # check the string is not empty
            # always puting the value in the first item
            df.at[i, 0] = value # put the value in the frame

df.to_csv('filename.txt') # output the dataframe to a file

Bagaimana ini bisa dibuat lebih baik adalah dengan meletakkan item dalam satu baris ke dalam kamus dan memasukkannya ke dalam datframe. tapi saya menulis ini di ponsel saya jadi saya tidak bisa mengujinya.

YasserKhalil Dec 11 2020 at 11:32

Dengan bantuan besar dari @Paul Brennan, saya dapat memodifikasi kode untuk mendapatkan hasil akhir yang diinginkan

import pandas as pd
from selenium import webdriver

driver = webdriver.Chrome("C:/chromedriver.exe")
driver.get('file:///C:/Users/Future/Desktop/local.html')
counter = len(driver.find_elements_by_id("Section3"))
xpath = "//div[@id='Section3']/following-sibling::div[count(preceding-sibling::div[@id='Section3'])={0} and count(following-sibling::div[@id='Section3'])={1}]"
finallist = []

for i in range(counter):
    #print('\nRow #{} \n'.format(i + 1))
    rowlist=[]
    _xpath = xpath.format(i + 1, counter - (i + 1))
    cells = driver.find_elements_by_xpath(_xpath)
    #if i == 0:
        #df = pd.DataFrame(columns=cells) # fill the dataframe with the column names
    for cell in cells:
        try:
            value = cell.find_element_by_xpath(".//td").text
            rowlist.append(value)
        except:
            break
    finallist.append(rowlist)
    
df = pd.DataFrame(finallist)
df[df.columns[[2, 0, 1, 7, 9, 8, 3, 5, 6, 4]]]

Kode berfungsi dengan baik sekarang tetapi terlalu lambat. Apakah ada cara untuk membuatnya lebih cepat?