代码之家  ›  专栏  ›  技术社区  ›  Cosmin

将未找到的元素设置为空/空,而不是跳过它们

  •  3
  • Cosmin  · 技术社区  · 7 年前

    我想知道如何将未找到的元素设置为空,而不是跳过循环。有些情况下,名称、标题或公司丢失,所以我希望在我的csv中保留为空。我对python的了解是有限的,所以我可以使用一些帮助。

    我已经遇到的问题是,如果抛出异常,那么将完全跳过该行。实现我所期望的目标的最佳方法是什么?熊猫数据框能帮上忙吗?如果是,我该怎么写?我应该以不同的方式写入csv吗?

    filename = "C:\\scrape.csv"
    f = open(filename, "w")
    
    headers = "Name, Company, Title\n"
    
    f.write(headers)
    
    names = []
    for value in names:
    #Search
    browser.find_element_by_xpath("//*[@id='ctl09_FindFirstName']").send_keys(value)
    browser.find_element_by_xpath("//*[@id='ctl11_FindContacts']").click()
    try:
        for i in range(5):
            try:
                Name = browser.find_element_by_xpath("//*[@id='ctl11_DisplayName_"+str(i)+"']").text
                Company = browser.find_element_by_xpath("//*[@id='ctl11_CompanyNamePanel_"+str(i)+"']").text
                Title = browser.find_element_by_xpath("//*[@id='ctl11_CompanyTitlePanel_"+str(i)+"']").text
    
                f.write(Name.replace(",", "|") + "," + Company.replace(",", "|") + "," + Title.replace(",", "|") + "\n")
    
                #print("Name: " + browser.find_element_by_xpath("//*[@id='ctl11_DisplayName_"+str(i)+"']").text)
                #print("Company: " + browser.find_element_by_xpath("//*[@id='ctl11_CompanyNamePanel_"+str(i)+"']").text)
                #print("Title: " + browser.find_element_by_xpath("//*[@id='ctl11_CompanyTitlePanel_"+str(i)+"']").text)
            except NoSuchElementException:        
                continue                                                                                  
    except NoSuchElementException:
        pass
    f.close()
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   PixelEinstein    7 年前

    而不是使用 find_element_by ,您可以使用 find_elements_by .这样它将创建一个找到的元素列表,或者 空的 如果它找不到匹配的元素而不是抛出,请列出 NoSuchElementException .

    试试这个:

    browser.find_element_by_xpath("//*[@id='ctl09_FindFirstName']").send_keys(value)
    browser.find_element_by_xpath("//*[@id='ctl11_FindContacts']").click()
    for i in range(5):
        Name = browser.find_elements_by_xpath("//*[@id='ctl11_DisplayName_"+str(i)+"']").text
        Company = browser.find_elements_by_xpath("//*[@id='ctl11_CompanyNamePanel_"+str(i)+"']").text
        Title = browser.find_elements_by_xpath("//*[@id='ctl11_CompanyTitlePanel_"+str(i)+"']").text
    
        if not Name: name = "None"
        else: name = Name[0].text
    
        if not Company: company = "None"
        else: company = Company[0].text
    
        if not Title: title = "None"
        else: title = Title[0].text
    
        f.write(name.replace(",", "|") + "," + company.replace(",", "|") + "," + title.replace(",", "|") + "\n")                                                                             
    f.close()
    
        2
  •  2
  •   Andrei Suvorkov    7 年前

    您可以这样做:

    filename = "C:\\scrape.csv"
    f = open(filename, "w")
    
    headers = "Name, Company, Title\n"
    
    f.write(headers)
    
    names = []
    for value in names:
        #Search
        browser.find_element_by_xpath("//*[@id='ctl09_FindFirstName']").send_keys(value)
        browser.find_element_by_xpath("//*[@id='ctl11_FindContacts']").click()
    
    
        for i in range(5):
            Names = browser.find_elements_by_xpath("//*[@id='ctl11_DisplayName_" + str(i) + "']")
            if len(Names) == 0:
                name = 'Empty'
            else:
                name = Names[0].text
    
            Companys = browser.find_elements_by_xpath("//*[@id='ctl11_CompanyNamePanel_" + str(i) + "']")
            if len(Companys) == 0:
                company = 'Empty'
            else:
                company = Companys[0].text
    
            Titles = browser.find_elements_by_xpath("//*[@id='ctl11_CompanyTitlePanel_" + str(i) + "']")
            if len(Titles) == 0:
                title = 'Empty'
            else:
                title = Titles[0].text
    
            f.write(name.replace(",", "|") + "," + company.replace(",", "|") + "," + title.replace(",", "|") + "\n")
    
    f.close()
    

    正如你所看到的,你不需要 try/catch 不再。如果找不到元素,元素将被设置为“空”字符串。 browser.find_elements... 不投掷 NoSuchElementException

        3
  •  2
  •   BenG    7 年前

    其他答案也解决了跳线的问题,但不包括任何有关熊猫的信息。

    对于pandas,您可以潜在地使用一个数据帧,而不是像您那样将每一行写入一个文件。然后,可以使用 to_csv() 获取你的数据。我个人使用 this link 引用许多不同的方法来将数据获取到数据帧中。

    我要做的方法是在当前 try 块来分隔由这些变量的所有实例组成的列表。在本例中,从三个空白列表开始

    names_list = []
    companies_list = []
    titles_list = []
    

    然后在循环中去掉值

    names_list.append(name)
    companes_list.append(company)
    titles_list.append(title)
    

    然后我会 tuple() 这些列表并将它们添加到一个名为 data 并创建一个名为 labels 保存列名。

    names_tup = tuple(names_list)
    companies_tup = tuple(companies_list)
    titles_tup = tuple(titles_list)
    data = [names_tup, companies_tup, titles_tup]
    labels = ['name', 'company', 'title']
    

    然后将数据转换为数据帧,如上面引用的链接中所示。

    import pandas as pd
    pd.DataFrame.from_records(data, columns=labels)
    

    最后,将数据帧保存为csv:

    fileLocation = 'path\\to\\filename.csv'
    df.to_csv(path_or_buf = fileLocation, sep=',')