Python / Selenium:如何在动态生成的表中迭代tr

时间:2018-01-22 15:57:34

标签: python selenium dictionary html-table

我正在尝试从此网站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做好准备? 谢谢

1 个答案:

答案 0 :(得分:0)

有两个指令可以解决您所描述的问题:

  1. 使用driver.find_elements_by_<something>()迭代表格的所有行。
    我建议在静态网页上使用它。考虑到你实际上利用了Selenium的功能,它更自然。
  2. 下载网页的HTML代码,解析并操纵它&#34;离线&#34;。
    当页面不断更新时,这将更好地工作,并保证您不会调用页面中的陈旧元素。但是,它会强制您解析HTML代码,这绝不是一件有趣的事情。
  3. 选择最适合您的方式,然后您可以继续解决更多技术问题。祝您好运!


    编辑:请注意该方法如何调用元素 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)。