【问题标题】:How to extract a table to csv using Python from website without having table id如何在没有表 ID 的情况下使用 Python 从网站将表提取到 csv
【发布时间】:2021-11-15 01:40:29
【问题描述】:

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

我已尝试在此处使用有关相关主题的每一条建议(例如,How to extract tables from websites in PythonPython Extract Table from URL to csvextract a html table data to csv file 等等)

我以为我最初的问题是我没有表ID(例如在其他示例中,我只找到了(表)类名MuiTable-root。但经过更多挖掘后我发现每当我阅读 url 时,我得到的 HTML 代码是完全不同的,而不是我使用 Inspect(O) 点击浏览器时看到的。

我已经尝试了我在这里找到的几乎所有东西,所以我不确定它是否有助于引用每个单独的代码。作为一个例子,我只是引用以下内容,我试图让它发挥作用。这个想法很简单(找到表的tr 部分并获取th(标题)和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,还有很多东西要学!

【问题讨论】:

  • 看起来该网站正在使用 javascript。你需要像 Selenium 这样的工具。
  • 在浏览器中进一步检查所有请求后,表中有返回json数据的urlapi2.lunarcrush.com/v2/…。但是您需要进一步查看,看看您是否可以提取key 参数,我预计它会改变
  • 我去看看!谢谢!
  • 查看浏览器开发者工具中的Network 标签。切换到网络选项卡并刷新页面,以便您可以看到所有信息
  • 在这种情况下,它说plain,这有点不寻常。但是,请注意 url 有 key 参数,我希望它会随着时间/会话而改变。所以 Selenium 可能是更好的探索方法

标签: python html python-3.x csv export-to-csv


【解决方案1】:

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

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

pip install pandas
pip install selenium
pip install webdriver-manager

有关硒的更多信息可以找到:https://selenium-python.readthedocs.io/ 和熊猫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

您实例化您的网络驱动程序(由 python 控制的开放式 chrome)。在变量“驱动程序”中。您使用驱动程序“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")

【讨论】:

  • 感谢您的回复!!但我同意!我现在正试图找出如何解决这些问题。我现在正在阅读有关硒的文章
  • 我希望现在更好
  • 确实好多了,但我仍然在努力运行代码。 python script.py 返回 ModuleNotFoundError: No module named 'selenium' 即使我尝试安装它。 python3 script.py 给我NameError: name 'ChromeDriverManager' is not defined
  • 在终端先做:pip install selenium,在ipython/jupyter你应该先写一个感叹号“!pip install selenium”
  • 当然可以,但是如果你已经有 Geckodriver,你可以忘记 DriverManager,例如: options = webdriver.FirefoxOptions() options.add_argument('--ignore-certificate -errors') options.add_argument('--incognito') driver = webdriver.Firefox(options=options)
猜你喜欢
  • 2017-08-03
  • 2022-08-19
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多