J'essayais de faire une liste de tous les 1000 meilleurs comptes d'instagrameurs sur ce site Web: ' https: / /hypeauditor.com/top-instagram/ '. La liste qui revient de lxml est vide à la fois pour lxml.html et lxml.etree.
J'ai essayé de supprimer tbody, supprimer text () et upper xpath, mais tout a échoué. ce qui vaut la peine de remarquer, c'est qu'avec le xpath supérieur, cela m'a renvoyé quelque chose, mais c'est tout sauf /n.
J'ai d'abord essayé lxml.etree
s_market.xpath('//*[@id="bloggers-top-table"]/tbody/text()')
alors j'ai aussi essayé lxml.html.
tree=html.fromstring(r_market.content) result=tree.xpath('//*[@id="bloggers-top-table"]/tr/td/h4/text()')
de plus, j'ai essayé ce xpath:
market_url='https://hypeauditor.com/top-instagram/' r_market=requests.get(market_url) s_market=etree.HTML(r_market)` file_market=s_market.xpath('//*[@id="bloggers-top-table"]/tr[1]/td[3]/a/text()')
Il n'a pas donnez-moi une erreur. Mais après toutes les tentatives, cela me donne toujours une liste vide ou une liste pleine de n /.
Je ne suis pas vraiment expérimenté dans le web scraping donc il est possible que je viens de faire une erreur stupide quelque part, mais comme sans les données, je ne peux pas démarrer mon modèle d'apprentissage automatique, j'ai vraiment du mal, merci de m'aider.
3 Réponses :
Un moyen plus simple de le faire serait d'utiliser des pandas
. Il peut lire des tableaux HTML simples comme celui-ci sans problème. Essayez le code suivant pour supprimer toute la table.
import pandas as pd df = pd.read_html('https://hypeauditor.com/top-instagram/')
Vous voudrez certainement vous familiariser avec le package BeautifulSoup qui vous permet de naviguer dans le contenu d'une page Web en python.
Utilisation de BeautifulSoup:
import requests from bs4 import BeautifulSoup url = 'https://hypeauditor.com/top-instagram/' r = requests.get(url) html = r.text soup = BeautifulSoup(html, 'html.parser') top_bloggers = soup.find('table', id="bloggers-top-table") table_body = top_bloggers.find('tbody') rows = table_body.find_all('tr') # For all data: # Will retrieve a list of lists, good for inputting to pandas data=[] for row in rows: cols = row.find_all('td') cols = [ele.text.strip() for ele in cols] data.append([ele for ele in cols if ele]) # Get rid of empty values # For just handles: # Will retrieve a list of handles, only handles=[] for row in rows: cols = row.find_all('td') values = cols[3].text.strip().split('\n') handles.append(values[-1])
La boucle for que j'utilise pour les lignes provient de cette réponse
Merci pour votre réponse détaillée et passionnée, ma question est résolue. Je vais certainement regarder Beautiful Soup.
Encore une question, j'espère que ce n'est pas trop demander. Comment supprimer toutes les pages du tableau au lieu de la première?
Demandez-vous des tableaux supplémentaires sur cette page Web spécifique? Ou des pages Web supplémentaires?
comme, obtenir des tableaux sur " hypeauditor.com/top-instagram/p=2 " et tout le chemin à 20.
Vous pouvez créer une boucle for ou while pour parcourir chacun des identifiants dans l'URL. Par exemple: urls = ['https://hypeauditor.com/top-instagram/p2=p{i}') pour i dans la plage (1 100)]
Voici un moyen plus léger d'obtenir uniquement cette colonne en utilisant nth-of-type. Vous devriez trouver cela plus rapidement.
import requests from bs4 import BeautifulSoup as bs r = requests.get('https://hypeauditor.com/top-instagram/') soup = bs(r.content, 'lxml') accounts = [item.text.strip().split('\n') for item in soup.select('#bloggers-top-table td:nth-of-type(4)')][1:] print(accounts)
étiez-vous après le tableau entier ou juste certaines colonnes?
Je suis seulement après la chronique du compte de l'instagrameur.