J'essaie de construire une liste d'URL à partir d'un forum en ligne. Il est nécessaire d'utiliser BeautifulSoup dans mon cas. L'objectif est une liste d'URL contenant chaque page d'un fil, par exemple

[http://forum.pcgames.de/stellt-euch-vor/9331721-update-im-out-bitches.html, 
http://forum.pcgames.de/stellt-euch-vor/9331721-update-im-out-bitches-2.html, 
http://forum.pcgames.de/stellt-euch-vor/9331721-update-im-out-bitches-3.html]

Ce qui fonctionne est le suivant:

#import modules
import requests
from bs4 import BeautifulSoup
#define main-url
url = 'http://forum.pcgames.de/stellt-euch-vor/9331721-update-im-out-bitches.html'
#create a list of urls
urls=[url]
#load url
page = requests.get(url)
#parse it using BeautifulSoup
soup = BeautifulSoup(page.text, 'html.parser')
#search for the url of the next page
nextpage = soup.find("a", ["pag next"]).get('href')
#append the urls of the next page to the list of urls
urls.append(nextpage)
print(urls)

Lorsque j'essaie de créer une boucle if pour les pages suivantes, cela ne fonctionnera pas. Pourquoi?

for url in urls:
    urls.append(soup.find("a", ["pag next"]).get('href'))

("a", ["pag next"]).get('href') identifie l'url de la page suivante)

Ce n'est pas une option d'utiliser la pagination de l'URL car il y aura de nombreux autres threads à explorer. J'utilise Jupyter Notebook server 5.7.4 sur un macbook pro Python 3.7.1 IPython 7.2.0

Je connais l'existence de cet article. Pour mes connaissances de débutant le code est écrit trop compliqué mais peut-être que votre expérience vous permet de l'appliquer sur mon cas d'utilisation.

0
vizzerdrix 18 mars 2019 à 18:52

2 réponses

Meilleure réponse

Le modèle d'URL pour la pagination est toujours cohérent avec ce site, vous n'avez donc pas besoin de faire de demande pour récupérer les URL des pages. Au lieu de cela, vous pouvez analyser le texte dans le bouton qui dit "Page 1 sur 10" et construire les URL de page après avoir connu le numéro de page final.

import re

import requests
from bs4 import BeautifulSoup

thread_url = "http://forum.pcgames.de/stellt-euch-vor/9331721-update-im-out-bitches.html"
r = requests.get(thread_url)
soup = BeautifulSoup(r.content, 'lxml')
pattern = re.compile(r'Seite\s\d+\svon\s(\d+)', re.I)
pages = soup.find('a', text=pattern).text.strip()
pages = int(pattern.match(pages).group(1))
page_urls = [f"{thread_url[:-5]}-{p}.html" for p in range(1, pages + 1)]
for url in page_urls:
    print(url)
0
nicholishen 18 mars 2019 à 16:14

Vous parcourez les URL et l'ajoutez à lui-même afin que la taille de la liste continue d'augmenter indéfiniment.

Vous ajoutez chaque URL des URL à l'URL - voyez-vous le problème? urls continue de croître ... il a également déjà chaque URL que vous parcourez à l'intérieur de celui-ci. Voulez-vous dire d'appeler une fonction qui exécute le code précédent sur chaque URL suivante, puis l'ajoute à la liste?

0
Matthew Kligerman 18 mars 2019 à 15:59