2017-05-03 3 views
0

Mon code de référence:BeautifulSoup retourne urls de pages sur le site même raccourci

import httplib2 
from bs4 import BeautifulSoup 

h = httplib2.Http('.cache') 
response, content = h.request('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html') 
soup = BeautifulSoup(content, "lxml") 
urls = [] 
for tag in soup.findAll('a', href=True): 
    urls.append(tag['href']) 
responses = [] 
contents = [] 
for url in urls: 
    try: 
     response1, content1 = h.request(url) 
     responses.append(response1) 
     contents.append(content1) 
    except: 
     pass 

L'idée est, je reçois la charge utile d'une page Web, puis gratter que pour les liens hypertexte. L'un des liens est de yahoo.com, l'autre « http://csb.stanford.edu/class/public/index.html »

Cependant le résultat que je reçois de BeautifulSoup est:

>>> urls 
['http://www.yahoo.com/', '../../index.html'] 

Cela pose un problème, parce que la deuxième partie du script ne peut pas être exécuté sur la seconde URL raccourcie. Est-il possible de faire en sorte que BeautifulSoup récupère l'URL complète?

Répondre

1

C'est parce que le lien sur la page Web est en fait de cette forme. Le code HTML de la page est:

<p>Or let's just link to <a href=../../index.html>another page on this server</a></p>

Ceci est appelé un lien relatif.

Pour convertir cela en un lien absolu, vous pouvez utiliser urljoin à partir de la bibliothèque standard.

from urllib.parse import urljoin # Python3 

urljoin('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html`, 
     '../../index.html') 
# returns http://csb.stanford.edu/class/public/index.html 
+0

bien sûr, merci. Je peux inclure la partie de jointure d'url dans les exceptions. –

+0

sur une autre réflexion, je ne vais pas déranger, c'est seulement spécifique à une seule page Web et ne vaut pas la peine de déranger vraiment –