【问题标题】:Separate the elements I extracted from a web page by columns and print them in csv with python将我从网页中提取的元素按列分开,并使用 python 在 csv 中打印它们
【发布时间】:2020-09-08 21:54:06
【问题描述】:

我开始学习 Python,我有这段代码可以很好地用于网络抓取,我已经有了我想要的信息,我正在将这些数据发送到 CSV,但它只在一个单元格中打印了所有文本。

你能帮我解决这个问题,以便我可以在不同的列中打印每个元素吗?

这是我的代码:

from bs4 import BeautifulSoup
import csv
with open('output_file_name', 'w', newline='') as csv_file:
    writer3 = csv.writer(csv_file, delimiter=';')

file4 = open('hola4.csv', 'w', newline='')
writer4 = csv.writer(file4)


class Table:
    def __init__(self, driver):
        self.driver = driver

    def get_column_info(self):
        column_info = []
        columns = self.driver.find_elements_by_xpath("/html/body/div[1]/main/div[2]/div[3]/div/div/div[5]/div[2]/table/thead/tr/th")
        for column in columns:
            column_info.append(str(column.text.replace("%","")))
            writer2.writerow([column_info])
        return column_info


    def get_results(self, index=None):
       columns = self.get_column_info()
       data = {}
       elements = self.driver.find_elements_by_xpath("//div[@id = 'resumen_mensual']/table/tbody[@id = 'body_tmes' ]/tr[contains(@class, 'ini')]{}"
                                                    .format("[{}]".format(index) if index else ""))
       for elementos in elements:
           prueba = elementos.text.strip()


       for element in elements:
           current_index = elements.index(element) + 1 if not index else index
           parsed_data = {}
           for column in columns:
               value = element.find_element_by_xpath("//div[@id = 'resumen_mensual']/table/tbody[@id = 'body_tmes' ]/tr[contains(@class, 'ini')][{}]"
                                                      "/td[{}]"
                                                      .format(current_index,columns.index(column) + 1)).text
               parsed_data.update({column: str(value)})
           data.update({current_index:  parsed_data})
       return data


    def get_number_of_results(self):
        return len(self.driver.find_elements_by_xpath("//div[@id = 'resumen_mensual']/table/tbody[@id = 'body_tmes' ]/tr[contains(@class, 'ini')]"))


if "__main__" == __name__:
    table = Table(driver)

    writer4.writerow([table.get_column_info()])
    writer3.writerow([table.get_results()])

    table = Table(driver)

    print(table.get_column_info())

如果我运行它,我就会得到这个结果:

['DÍA', 'T. MEDIA', 'T. MÁX', 'T. MÍN', 'V. MEDIA VIENTO', 'RACHAS MÁX', 'PRESIÓN MEDIA', 'LLUVIA']

在 csv 中:

【问题讨论】:

    标签: python csv beautifulsoup


    【解决方案1】:

    我认为你不需要writer2.writerow([column_info])

    将分隔符设置为\t (delimiter='\t')。

    代替:

    writer4.writerow([table.get_column_info()])
    writer3.writerow([table.get_results()])
    

    做:

    for info in table.get_column_info():
        writer4.writerow(info)
    for result in table.get_results():
        writer3.writerow(result)
    

    【讨论】:

    • 首先感谢,这是一个巨大的改进现在关于您的更正这些命令或特征的名称是什么,您可以添加到括号内部,例如(分隔符='\t'),这甚至意味着什么,我怎样才能获得所有可以在那里修改的东西的信息?现在关于代码我仍然有一个错误,那就是: writer3.writerow(result) _csv.Error: iterable expected, not int 并且 csv 不是按列显示每个单词,而是按行显示,此外单词是分开的按单元格,每个单元格一个字母
    • \t 表示制表符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多