Python Значения таблицы Selenium Webdriver в Excel - PullRequest
0 голосов
/ 20 февраля 2020

Я работаю над проектом очистки таблицы с веб-сайта. Я не смогу дать полный код, так как это сайт, указанный компанией c с логином, поэтому я выбрал Selenium. Я разместил таблицу в HTML коде:

class Table:
    def __init__(self, driver):
        self.driver = driver
    def get_row_info(self):
        table_id = self.driver.find_element(By.ID, 'dgTickets')
        rows = table_id.find_elements(By.TAG_NAME, "tr")
        col = []
        i = 0
        for i in rows[0]:
            i+=1
            name = i.text()
            col.append((name, []))
        for j in range(1,len(rows)):
            T = rows[j]
            i = 0
            for t in T.iterchildren():
                data = t.text_content()
                if i>0:
                    try:
                        data = int(data)
                    except:
                        pass
                col[i][1].append(data)
                i+=1
        Dict = {title:column for (title, column) in col}

Это возвращает мне ошибку, что это не повторяемое значение.

Я думаю, что я пытаюсь сделать здесь относительно самоочевиден. Прежде всего я пытаюсь вернуть веб-таблицу и в конечном итоге получить ее в pandas фрейме данных для анализа. Используя различные методы, я могу заставить столбцы распечатывать их тексты, но, похоже, существует проблема с передачей этого столбцу в указанной таблице. Вот один из способов вернуть столбец:

        for row in rows:
            col0 = row.find_elements(By.TAG_NAME, "td")[0]

Честно говоря, я немного растерялся на этом этапе. Любые предложения для меня?

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете использовать pandas .read_ html () , чтобы получить все таблицы на странице в виде списка DataFrames. Это работает очень быстро.

import selenium.webdriver
import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'

driver = selenium.webdriver.Firefox()
driver.get(url)

# --- get table ---

all_tables = pd.read_html(driver.page_source, attrs={'id': 'constituents'})
df = all_tables[0]

# --- show it ---

print(df)

Если вы хотите сделать это вручную - но для этого примера это займет гораздо больше времени.

import selenium.webdriver
import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'

driver = selenium.webdriver.Firefox()
driver.get(url)

# --- get table ---

headers = []
columns = dict()

table_id = driver.find_element_by_id('constituents')
all_rows = table_id.find_elements_by_tag_name("tr")

# --- headers ---

row = all_rows[0]
all_items = row.find_elements_by_tag_name("th")
for item in all_items:
    name = item.text
    columns[name] = []
    headers.append(name)

print(headers)

# --- data ---

for row in all_rows[1:]:
    all_items = row.find_elements_by_tag_name("td")
    for name, item in zip(headers, all_items):
        value = item.text
        columns[name].append(value)

df = pd.DataFrame(columns)

# --- show it ---

print(df)
...