Le code ci-dessous donne une valeur pour l'ID "resultStats", que je voudrais enregistrer dans un fichier CSV. Existe-t-il un moyen intelligent d'avoir les "desire_google_queries" (c'est-à-dire les termes de recherche) dans la colonne A et les valeurs "resultStats" dans la colonne B du CSV?
J'ai vu qu'il y avait un certain nombre de fils sur ce sujet mais aucun des solutions que j'ai lues ont fonctionné pour la situation spécifique.
from bs4 import BeautifulSoup import urllib.request import csv desired_google_queries = ['Elon Musk' , 'Tesla', 'Microsoft'] for query in desired_google_queries: url = 'http://google.com/search?q=' + query req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) response = urllib.request.urlopen( req ) html = response.read() soup = BeautifulSoup(html, 'html.parser') resultStats = soup.find(id="resultStats").string print(resultStats)
3 Réponses :
La réponse d'origine a malheureusement été supprimée - veuillez trouver ci-dessous le code pour toutes les autres personnes intéressées par la situation. Merci à l'utilisateur qui a publié la solution en premier lieu:
with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['query', 'resultStats']) for query in desired_google_queries: ... spamwriter.writerow([query, resultStats])
J'ai pris la liberté de réécrire ceci pour utiliser la bibliothèque Requests au lieu de urllib, mais ceci montre comment écrire en CSV, ce qui vous intéressait le plus:
from bs4 import BeautifulSoup import requests import csv desired_google_queries = ['Elon Musk' , 'Tesla', 'Microsoft'] result_stats = dict() for query in desired_google_queries: url = 'http://google.com/search?q=' + query response = requests.get(url) html = response.text soup = BeautifulSoup(html, 'html.parser') result_stats[query] = soup.find(id="resultStats").string with open ('searchstats.csv', 'w', newline='') as fout: cw = csv.writer(fout) for q in desired_google_queries: cw.writerow([q, result_stats[q]])
au lieu de l'écrire ligne par ligne, vous pouvez tout écrire en une seule fois en stockant d'abord le résultat dans un dataframe pandas. Voir ci-dessous le code
from bs4 import BeautifulSoup import urllib.request import pandas as pd data_dict = {'desired_google_queries': [], 'resultStats': []} desired_google_queries = ['Elon Musk' , 'Tesla', 'Microsoft'] for query in desired_google_queries: url = 'http://google.com/search?q=' + query req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) response = urllib.request.urlopen( req ) html = response.read() soup = BeautifulSoup(html, 'html.parser') resultStats = soup.find(id="resultStats").string data_dict['desired_google_queries'].append(query) data_dict['resultStats'].append(resultStats) df = pd.DataFrame(data=data_dict) df.to_csv(path_or_buf='path/where/you/want/to/save/thisfile.csv', index=None)