如何在没有 table id 的情况下使用 Python 从网站提取 table 到 csv

How to extract a table to csv using Python from website without having table id

我正在尝试每天从特定网站制作一个 csv table:https://lunarcrush.com/exchanges

我已经尝试在这里使用关于相关主题的每一条建议(例如 How to extract tables from websites in Python , Python Extract Table from URL to csv , extract a html table data to csv file 以及更多)

我认为我最初的问题是我没有 table id(例如在其他示例中,我只找到了 (table) class name MuiTable-root。但在进一步挖掘之后,我发现每当我阅读 url 时,我得到的 HTML 代码是完全不同的,而不是我在阅读时看到的代码我用Inspect(O)点击我的浏览器

我已经尝试了在这里找到的几乎所有内容,所以我不确定引用每一个代码是否有帮助。作为一个例子,我只是引用以下内容,我试图让它发挥作用。思路很简单(找到table的tr部分,得到th(header)和td(数据),然后我将它们提取到 csv。

from lxml import etree
import urllib.request

web = urllib.request.urlopen("https://lunarcrush.com/exchanges")
s = web.read()

html = etree.HTML(s)

## Get all 'tr'
tr_nodes = html.xpath('//table[@class="MuiTableHead-root"]/tr')

## 'th' is inside first 'tr'
header = [i[0].text for i in tr_nodes[0].xpath("th")]

## Get text from rest all 'tr'
td_content = [[td.text for td in tr.xpath('td')] for tr in tr_nodes[1:]]

print(td_content)

有什么想法吗?很抱歉我的问题很长(也许很愚蠢),我才刚刚开始使用 python,还有很多东西要学!

使用 pandas 收集数据框并使用 selenium 填充它。

您可以在终端输入安装它们:

pip install pandas
pip install selenium
pip install webdriver-manager

可以找到有关硒的更多信息:https://selenium-python.readthedocs.io/ 和 pandas https://pandas.pydata.org/docs/

可以找到有关安装和驱动程序的更多信息:https://selenium-python.readthedocs.io/installation.html

通常您会下载驱动程序并将其设置为 运行,如您在文档中所见。但是 webdriver_manager 会自动执行类似的操作。

driver = webdriver.Chrome(ChromeDriverManager().install())

在代码中您需要导入您安装的包,即 pandas 和 selenium。

from selenium import webdriver 
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd

您实例化您的网络驱动程序(打开 chrome 由 python 控制)。在变量“驱动程序”中。您找到带有驱动程序“find_elements_by_xpath”的页面的 xpath 并从中提取属性(必要时)。

xpath = '//tbody//tr'
driver.find_elements_by_xpath(xpath)
row = [ i.text for i in driver.find_elements_by_xpath(xpath)]

最后,您将找到的内容列成一个列表,定义一个字典以将数据保存在 pandas 数据框中并将其导出到您的 csv 文件:

dictionary = {'row ': row}
df = pd.DataFrame(dictionary)
df.to_csv("filename")

整个事情应该是这样的:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://lunarcrush.com/exchanges")

xpath = '//tbody//tr'
row = [i.text for i in driver.find_elements_by_xpath(xpath)]

# notice that i.text is not always necessary depends on the attribute of the html element.
# In your case you may want to include some more things like the header and the index and also split the row look .str.split('') at pandas
dictionary = {'row ': row}
df = pd.DataFrame(dictionary)
df.to_csv("filename")