3 votes

Comment récupérer un seul élément parmi deux éléments ayant le même ensemble d'attributs et la même hiérarchie dans le code source html (en utilisant la belle soupe de Python) ?

This is the source code of IMDB website

Je veux extraire l'élément surligné en bleu dans l'image, qui représente le "nombre de votes" pour un film particulier. Lorsque j'essaie de l'extraire, j'obtiens également l'élément du bas dans l'image, qui représente les "collections" pour ce film, car les deux éléments ont les mêmes attributs et sont dans la même hiérarchie.

3voto

Arno-Nymous Points 390

Une approche pourrait être d'itérer sur tous les frères et sœurs de <p class="sort-num_votes-visible"> et si vous trouvez un <span name="nv"> qui est entouré d'un <span class="text-muted"> et un <span class="ghost"> alors ce doit être la portée que vous recherchez. Cela implique bien sûr que la structure de ce fragment de HTML est toujours la même. Si l'un de ces span pourraient manquer, cette méthode échoue évidemment.

S'il est garanti que ces deux travées sont toujours présentes et dans l'ordre exact, vous pouvez faire quelque chose comme ceci (votre HTML modifié est dans le fichier html_soup ) :

votes = html_soup.find("p", {"class": "sort-num_votes-visible").find_all("span", {"name": "nv"})[0]

EDIT :

Selon votre commentaire, vous pourriez faire ce qui suit afin d'analyser les votes pour plusieurs films :

for p in html_soup.find("p", {"class": "sort-num_votes-visible"}):
    votes = p.find_all("span", {"name": "nv"})[0]

    < Put whatever code here for each of your movies
      ...
    >

1voto

Krushi Raj Points 73

Vous pouvez utiliser quelque chose comme ceci (en supposant que vous utilisez BeautifulSoup) :

soup = BeautifulSoup('yourhtml', 'lxml')
p_sort = soup.find('p', {'class':'sort-num_votes-visible'})
req_span = p_sort.find_all('span', {'name':'nv'})[0]

req_span contiendra la balise que vous avez demandée.

1voto

Rohit Raj Points 139

Si l'ordre de ces deux éléments similaires est le même, alors vous pouvez sélectionner le premier élément du résultat ou utiliser .find() au lieu de .find_all()[0].

1voto

jdxin0 Points 31

Je pense parsel est un meilleur paquet d'analyse html avec xpath soutien.

from parsel import Selector

s = Selector(text=html)
nv_data = s.xpath('//span[@name="nv"]/@data-value').extract_first()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X