【问题标题】:How to for loop using Selenium and BeautifulSoup如何使用 Selenium 和 BeautifulSoup 进行循环
【发布时间】:2019-04-11 20:31:13
【问题描述】:

我有一个要遍历循环的字符串列表。但是,我不确定如何为此任务创建一个 for 循环。该功能从网站上抓取信息。根据“名称”,这些表有数万行。我该怎么做?

我有清单:

list = ['name1', 'name2', 'name3']

这是我的代码:

import selenium
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import selenium.webdriver as webdriver
import pandas as pd
import time
from bs4 import BeautifulSoup

def get_results(search_term):
        global df
        url = "https://investor.dn.no/#!/NorgesAksjer/"       
        browser = webdriver.Chrome("C:/Users/Downloads/chromedriver.exe"))
        browser.get(url)
        search_box = browser.find_element_by_id("ar-search-input")
        search_box.send_keys(search_term)
        browser.find_element_by_css_selector(".btn.btn-lg.btn-primary").click()
        WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.LINK_TEXT, search_term))).click()
        WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.XPATH,  
                     "//*[@id='dninvestor-content']/div[1]/div/div[1]/div[2]/div[2]/div[1]/div[3]/div/div[2]/div/div[1]/a"))).click() # 
        WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, 
                     "//*[@id='dninvestor-content']/div[1]/div/div[1]/div[2]/div[2]/div[1]/div[3]/div/div[2]/div/table/tbody/tr[101]/td[1]/a"))).click() 
        time.sleep(5)
        result = []
        html = browser.page_source
        soup = BeautifulSoup(html, 'html.parser')
            for posts in soup.findAll('div',{'class':'col-xs-12 ng-scope'}):
                for tr in posts.findAll('tr')[1:]:
                    sh = [td for td in tr.stripped_strings]
                    result.append(list(sh))
                    df = pd.DataFrame(result)
        return result

我想创建一个 for 循环,这样 get_results(list) 将是:

get_results('name1')
get_results('name2')
get_results('name3')

结果将附加到df

【问题讨论】:

    标签: python selenium for-loop web-scraping beautifulsoup


    【解决方案1】:

    我会做如下的事情:

    final_result = []
    names = ['name1', 'name2', 'name3']
    for name in names:
        final_result.append(get_results(name))
    

    您如何转换为数据框实际上取决于您正在构建的结构。

    如果您的函数返回一个列表,您可以在 final_result 中建立一个列表列表,然后使用 pd.DataFrame 转换为数据框。

    【讨论】:

    • 您的解决方案按我的预期循环遍历列表。但是,结果没有存储到final_result,因为里面只有NoneTypes。
    • 您是否在返回列表的函数中添加了 return 语句?
    • 只需添加return result?我刚刚做了,没有任何改变。
    • 现在把return result放在正确的位置。我得到了一个字符串列表的列表。 (在我的示例中,三个列表的列表由字符串组成)。如何将此字符串列表列表转换为数据框?
    • 在结果上使用 pd 数据框
    【解决方案2】:
    myListLen = len(list)
    for i in range(0, myListLen):
      getResults(list[i])
    

    【讨论】:

    • 循环遍历列表,但没有存储值。
    • 你需要从你的函数返回数据然后代码应该是 -> new_Array = [] 然后在循环中 new_Array.append(get_results(name))
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2020-07-01
    • 2019-05-26
    相关资源
    最近更新 更多