我正在尝试从此网站https://coinmunity.co/下载该表,然后使用Pandas以一种简单的方式操作数据。 问题是该表是动态生成的,因此我无法轻易理解其结构或检测我需要执行循环作业的" tr。 我之前尝试过Requests和BeautifulSoup并且没有工作,所以有人推荐Selenium,但没有告诉我更多。
On Selenium我已经尝试了很多东西,包括xpaths,css选择器等......但没有任何效果。我的想法是以有序的方式为每一行提取数据,但行名称似乎有一个非常奇怪的名称,包括" _ngcontent"我无法理解它。
这是我的(无法正常运行)代码:
from selenium import webdriver
import pandas as pd
import time
from bs4 import BeautifulSoup
driver = webdriver.Firefox()
driver.implicitly_wait(10)
#driver.get("https://coinmunity.co/")
url = 'file:///C:/Users/nique/PycharmProjects/untitled/test1.html'
driver.get(url)
html = driver.page_source.encode('utf-8')
#html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, 'lxml')
results = []
symbol_list = []
#items = driver.find_elements_by_class_name('coin-link')
items = driver.find_elements_by_css_selector('.inner-container > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(2)')
#how_many = driver.find_elements_by_css_selector('html body app-root app-home div.outer-container div.inner-container table tbody tr')
count = 1
for el in range(1,3):
#row = driver.find_elements_by_css_selector('.inner-container > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child((count))')
row = driver.find_elements_by_xpath('/html/body/app-root/app-home/div/div/table/tbody/tr[count]')
symbol = row.find_element_by_class_name('coin-link')
followers = driver.find_elements_by_class_name('stats')[0]
changefollowers = driver.find_elements_by_class_name('stats')[1]
# subscribers = driver.find_elements_by_class_name('stats')[2]
# changesubscribers = driver.find_elements_by_class_name('stats')[3]
# price = driver.find_elements_by_class_name('stats')[4]
# changeprice = driver.find_elements_by_class_name('stats')[5]
count += 1
print(symbol)
# results.append({'Symbol': symbol.text, 'TFollowers': followers.text, 'ChangeFollowers': changefollowers.text,'Subscribers': subscribers.text,'ChangeSubscribers': changesubscribers.text,'Price': price.text, 'ChangePrice': changeprice.text})
print(symbol_list)
print(results)
如何以最简单,最整洁的方式下载此信息并为Pandas做好准备? 谢谢
答案 0 :(得分:0)
有两个指令可以解决您所描述的问题:
driver.find_elements_by_<something>()
迭代表格的所有行。 选择最适合您的方式,然后您可以继续解决更多技术问题。祝您好运!
编辑:请注意该方法如何调用元素 s ,因此您不应该提及元素的索引。所以在你的情况下你可以使用:
row = driver.find_elements_by_xpath('/html/body/app-root/app-home/div/div/table/tbody/tr')
# And not:
row = driver.find_elements_by_xpath('/html/body/app-root/app-home/div/div/table/tbody/tr[number]')
它将返回具有所提及属性的所有元素(在本例中为给定的xpath)。