【问题标题】:How to convert Python String into Pandas DataFrame using Selenium?如何使用 Selenium 将 Python 字符串转换为 Pandas DataFrame?
【发布时间】:2021-07-15 02:54:19
【问题描述】:

我仍在学习 Python,并且一直在练习网页抓取。我最近想尝试 Selenium。这是我目前的项目。

我的目标是将我的输出(我相信它是一个字符串)转换为 pandas 数据框。不幸的是,我不知道如何将所有数据分成各自的列。

到目前为止,这是我的代码:

from selenium import webdriver
import time
import pandas as pd

class FindByIdName():
    
    def test(self):
        baseUrl = 'https://vaccinefinder.org/'
        driver = webdriver.Chrome('C:\webdrivers\chromedriver.exe')
        driver.get(baseUrl)        
        time.sleep(3)
        
        #find covid vaccine button    
        vaccineElement = driver.find_element_by_xpath("/html//div[@id='__next']/div/div[2]/div[1]//button[.='Find COVID-19 Vaccines']")        
        vaccineElement.click()        
        time.sleep(3)  
        
        #uncheck moderna vaccine      
        modernaElement = driver.find_element_by_xpath("/html//div[@id='split-screen-content']/form/div[@class='search-form__fields-row']//label[.='Moderna COVID Vaccine']")
        modernaElement.click()
        time.sleep(2)
        
        #uncheck pfizer vaccine
        pfizerElement = driver.find_element_by_xpath("/html//div[@id='split-screen-content']/form/div[@class='search-form__fields-row']//label[.='Pfizer-BioNTech COVID Vaccine']")
        pfizerElement.click()
        time.sleep(2)
        
        #enter zip code
        zipElement = driver.find_element_by_xpath(".//*[@id='zipCode']")
        zipElement.send_keys('92646')        
        time.sleep(3)        
        
        #submit zipCode button
        searchElement = driver.find_element_by_xpath("//div[@id='split-screen-content']/form//button[@type='submit']")
        searchElement.click()        
        time.sleep(3)
        
        #find and print vaccine data
        listElement = driver.find_element_by_xpath("//div[@id='split-screen-content']/main/div[3]")        
        print(listElement.text)
        print(type(listElement.text))          
        driver.close()           
        
ff = FindByIdName()
ff.test()

这是我正在寻找的最终输出的示例:

#        Location                            Address                        Distance   Inventory
1.  Vons Pharmacy #3160        8891 Atlanta Ave Huntington Beach, CA 92646   .61 miles   Out Of Stock
2.  Walmart Inc #10-5601       21132 Beach Blvd Huntington Beach, CA 92648   1.05 miles  Out Of Stock
3.  CVS Pharmacy, Inc #09483   10011 Adams Ave  Huntington Beach, CA 92646   1.92 miles  Out Of Stock
...         ...                                 ...                              ...           ...

我在网上看到了一些示例,它们将字符串数据转换为数据帧,但数据看起来是 csv 格式:How to convert a string to a dataframe in Python

任何帮助将不胜感激。我会从你的建议中学到很多东西。谢谢! =)

【问题讨论】:

    标签: python pandas string dataframe


    【解决方案1】:

    如果您保存/返回 result 而不仅仅是打印:

            ...
            result = listElement.text
            driver.close()
            
            return result
    

    然后您可以将split()reshape() 放入一个数据框:

    result = ff.test().split('\n')
    
    columns = ['number', 'pharmacy', 'address', 'distance', 'status', 'view']
    data = np.array(result).reshape(len(result)//len(columns), len(columns))
    
    df = pd.DataFrame(data=data, columns=columns).drop(columns=['number', 'view'])
    
    pharmacy address distance status
    0 VONS PHARMACY #3160 8891 Atlanta Ave • Huntington Beach, CA 92646 0.61 miles Out Of Stock
    1 Walmart Inc #10-5601 21132 Beach Blvd • Huntington Beach, CA 92648 1.05 miles Out Of Stock
    ... ... ... ... ...
    48 Costco Wholesale Corporation #1110 7562 Center Ave • Huntington Beach, CA 92647 5.96 miles Out Of Stock
    49 Aloha Pharmacy #0596962 15611 Brookhurst St • Westminster, CA 92683 5.99 miles Out Of Stock

    【讨论】:

    • 你先生@tdy!非常感谢您的帮助。你能解释一下这行代码在做什么吗? data = np.array(result).reshape(len(result)//len(columns), len(columns))
    • @AbleArcher 不客气!该行将 result 从 python 列表转换为二维 numpy 数组。在最初的列表中,每 6 个元素就是一个新药房。新的 numpy 数组将一维列表重塑为二维列表,以便每行包含 1 个药房和 6 列信息。
    • 太棒了!非常感谢您的回复。 =)
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 2020-11-20
    • 2020-09-07
    • 2020-05-22
    • 2018-07-13
    • 1970-01-01
    • 2023-03-27
    • 2013-02-06
    相关资源
    最近更新 更多