2017-10-08 3 views
0

Je ne sais pas si le titre est très précis.
J'ai 5 méthodes qui webscrapent différents sites Web. Chaque fonction ressemble à ceci:Méthodes d'appel Python avec variables

def getWebsiteData1(last_article): 
    ty = datetime.today() 
    ty_str = ty.strftime('%d.%m.%Y') 
    url = 'http://www.website.com/news' 
    r = requests.get(url) 
    html = r.text 
    soup = BeautifulSoup(html, 'html.parser') 
    articles = soup.findAll("div", {"class": "text"})[:15] 
    data = list() 
    for article in articles: 
     article_data = dict() 
     if article.find("a").get('href') == last_article: 
      return data 
     else: 
      article_data["link"] = article.find("a").get('href') 
      article_data["title"] = article.find("a").get_text() 
      data.append(article_data) 
    return data 

Ainsi, chaque fonction renvoie une liste de dictionnaires.
j'ai une autre fonction qui appelle cette fonction:

def CreateArticle(website_number, slug): 
    website = Website.objects.get(slug=slug) 
    last_article = website.last_article 
    data = getWebsiteData1(last_article) # here i want to do something like 
    data = website_number(last_article) # but ofcourse this doesnt work 
    if len(data) == 0: 
     return "No news" 
else: 
    for i in data: 
     article = Article(service=service) 
     article.title = i['title'] 
     article.url = i['link'] 
     article.code = i['link'] 
     article.save() 
    service.last_article = data[0]['link'] 
    service.save(update_fields=['last_article']) 
    return data[0]['link'] 

Je veux être en mesure d'appeler Createarticle (website_number) et dire à cette fonction quelle fonction getWebsiteData il devrait appeler, pour que je puisse avoir qu'une seule fonction CreateArticle et non pour chaque fonction webscrapper une autre fonction CreateArticle. J'espère que ma question est claire: D

Répondre

2

En python, les fonctions sont de première classe, et peuvent être passées en arguments à d'autres fonctions.

def a(): 
    print("x") 

def b(some_function): 
    some_function() 

puis

b(a) 

imprimera "x" comme est appelée à l'intérieur b.

Ainsi, vous pouvez déterminer la fonction que vous souhaitez utiliser, puis la transmettre pour l'utiliser.