将Python Selenium Webdriver表值转换为Excel

将Python Selenium Webdriver表值转换为Excel,python,pandas,selenium,html-table,Python,Pandas,Selenium,Html Table,我正在做一个项目,从网站上刮下一张桌子。我将无法提供完整的代码,因为这是一个公司特定的网站登录,因此我选择硒。我已在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

我正在做一个项目,从网站上刮下一张桌子。我将无法提供完整的代码,因为这是一个公司特定的网站登录,因此我选择硒。我已在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}

这将返回一个错误,即它不是一个iterable值

我想我在这里要做的是相对来说不言自明的。首先,我尝试返回web表,并最终将其放入一个数据帧中进行解析。使用各种方法,我可以让列打印出它们的文本,但将其传递给表中的指定列似乎有问题。我找到了一种返回列的方法:

        for row in rows:
            col0 = row.find_elements(By.TAG_NAME, "td")[0]
老实说,我现在有点不知所措。有什么建议吗

您可以使用以数据帧列表的形式获取页面上的所有表。它工作得很快

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)
您可以使用以数据帧列表的形式获取页面上的所有表。它工作得很快

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)

始终将完整的错误消息(从单词“Traceback”开始)作为文本(而不是屏幕截图)进行讨论(不是评论)。还有其他有用的信息。第一个建议:始终显示完整的错误消息-它显示错误所在的行。我们无法运行它,因此无法看到错误。第二个建议:使用
print()
print(type(…)
查看变量中的内容。或者学习如何使用调试器。有些代码毫无意义-例如,行[0]中的i的
:i+=1
-
是一个列表,但您从列表
行[0]
中获取第一个元素,并尝试将其用作行[0]中i的列表
当你甚至把它当作
i
时,你就把它当作数字
i+=1
——但后来你把它当作对象
i.text()
。如果使用
i+=1
尝试获取下一个元素,则它是错误的。或者您可能必须对两个不同的元素使用相同的变量-
i=0
行中的i[0]
-但是Python不能在同一个变量中保留两个不同的值。顺便说一句:如果页面使用标准标记来创建表,那么您可以使用来获取页面上所有表作为
数据帧列表
-始终将完整的错误消息(从单词“Traceback”开始)作为文本(而不是屏幕截图)放在问题中(不是注释)。还有其他有用的信息。第一个建议:始终显示完整的错误消息-它显示错误所在的行。我们无法运行它,因此无法看到错误。第二个建议:使用
print()
print(type(…)
查看变量中的内容。或者学习如何使用调试器。有些代码毫无意义-例如,行[0]中的i的
:i+=1
-
是一个列表,但您从列表
行[0]
中获取第一个元素,并尝试将其用作行[0]中i的列表
当你甚至把它当作
i
时,你就把它当作数字
i+=1
——但后来你把它当作对象
i.text()
。如果使用
i+=1
尝试获取下一个元素,则它是错误的。或者您必须对两个不同的元素使用相同的变量-
i=0
行中的i[0]
-但是Python不能在同一个变量中保留两个不同的值。顺便说一句:如果page使用标准标记创建表,那么您可以使用来获取页面上的所有表,作为
数据帧的列表-