【问题标题】:Appending table values from a webpage to csv将网页中的表值附加到 csv
【发布时间】:2021-05-19 07:59:12
【问题描述】:

我想从网页中获取表格

import os
from webdriver_manager.chrome import ChromeDriverManager
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--start-maximized')
options.page_load_strategy = 'eager'
options.add_argument("--headless");
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)   
driver.get("https://munafasutra.com/nse/dividends")
file_object = open('divident.csv', 'a')

输出表

如何获取第一个表及其值?

【问题讨论】:

    标签: python python-3.x selenium webdriver


    【解决方案1】:

    您必须查看 HTML 路径并找到收集第一个表的 WebElement(单击鼠标右键时单击“检查”可以完成这项工作)。

    您可以使用以下代码行保存该 web 元素:

    first_table = driver.find_element_by_xpath("//div[@id = 'co']//table[1]") # The [1] is not really necessary as when using **find_element_by_xpath** will only look for the first element.
    

    然后,如果您查看该表中的数据是如何组织的,您可以观察到每一行都是由 tr WebElement 收集的。因此,如果您想将其写入 csv 文件,我建议您使用以下代码逐行写入:

    rows = first_table.find_elements_by_xpath("./tbody/tr") 
    for row in rows:
        entries_of_the_row = row.find_elements_by_xpath("./td") 
        row_to_csv = []
        for entry in entries_of_the_row:
            row_to_csv.append(entry.text)
        file_object.write(f"{row_to_csv[0]}, {row_to_csv[1]}, {row_to_csv[2]}, {row_to_csv[3]}, {row_to_csv[4]}\n")   
    file_object.close()
        
        
    

    【讨论】:

    • 缺少一个“/”来查找表。现在已经修复了。
    • 一个括号也不见了,但确实解决了这个问题。谢谢@JorgeHB
    【解决方案2】:

    您可以使用下面的 XPATH 来检索第一个表值:

    //h3[text()=' Earlier dividends announced by companies ']/preceding-sibling::table/descendant::td
    

    类似这样的:

    driver.get("https://munafasutra.com/nse/dividends")
    first_table = driver.find_elements(By.XPATH, "//h3[text()=' Earlier dividends announced by companies ']/preceding-sibling::table/descendant::td")
    for first in first_table: 
       print(first.text)
    

    【讨论】:

    • 每行的值没有以逗号分隔
    【解决方案3】:

    您可以使用 BeautifulSoup 来获取表格数据。如果您只想提取网页数据,则不需要 Selenium。

    您需要导入以下包:

    import csv
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    

    您可以使用以下代码提取表格的 HTML(汤变量将包含整个页面的 HTML 代码):

    url_munafasutra = "https://munafasutra.com/nse/dividends"
    html_munafasutra = urlopen(url_munafasutra)
    soup = BeautifulSoup(html_munafasutra, 'html')
    

    下面是为第一个表提取 HTML 的代码(这里 table 是标签 值,在 [] 中包含我们要提取数据的表的索引的):

    first_table = soup.find_all('table')[0]
    

    您还可以添加属性以清楚地识别表格以及标签名称。

    下面是提取所选表中所有行的代码:

    all_rows = first_table.findAll("tr")
    

    使用以下代码将数据写入 csv 文件:

    with open("C:\\Users\\abhay\\.spyder-py3\\table_extract.csv", "wt+", newline="") as f:
        table_to_csv = csv.writer(f)
        for row in all_rows:
            row_data = []
            for cell in row.findAll(["td", "th"]):
                row_data.append(cell.get_text())
            table_to_csv.writerow(row_data)
    

    以下是将第一个表数据提取到 csv 的完整代码:

    import csv
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    
    url_munafasutra = "https://munafasutra.com/nse/dividends" 
    html_munafasutra = urlopen(url_munafasutra)
    soup = BeautifulSoup(html_munafasutra, 'html')
    
    first_table = soup.find_all('table')[0]
    all_rows = first_table.findAll("tr")
    
    with open("C:\\Users\\abhay\\.spyder-py3\\table_extract.csv", "wt+", newline="") as f:
        table_to_csv = csv.writer(f)
        for row in all_rows:
            row_data = []
            for cell in row.findAll(["td", "th"]):
                row_data.append(cell.get_text())
            table_to_csv.writerow(row_data)
    

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2014-05-13
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多