web-dev-qa-db-fra.com

Grattez l'URL absolue au lieu d'un chemin relatif dans python

J'essaie d'obtenir tous les href d'un code HTML et de le stocker dans une liste pour un traitement futur tel que celui-ci:

Exemple d'URL: www.example-page-xl.com

 <body>
    <section>
    <a href="/helloworld/index.php"> Hello World </a>
    </section>
 </body>

J'utilise le code suivant pour répertorier les href:

import bs4 as bs4
import urllib.request

sauce = urllib.request.urlopen('https:www.example-page-xl.com').read()
soup = bs.BeautifulSoup(sauce,'lxml')

section = soup.section

for url in section.find_all('a'):
    print(url.get('href'))

Cependant, je voudrais stocker l'URL sous: www.example-page-xl.com/helloworld/index.php et pas seulement le chemin relatif qui est /helloworld/index.php

L'ajout/la jonction de l'URL avec le chemin relatif n'est pas nécessaire car les liens dynamiques peuvent varier lorsque je joins l'URL et le chemin relatif.

En un mot, je voudrais gratter l'URL absolue et non les chemins relatifs seuls (et sans se joindre)

14
user7800892

Dans ce cas ( urlparse.urljoin vous aide. Vous devez modifier votre code comme ceci-

import bs4 as bs4
import urllib.request
from urlparse import  urljoin

web_url = 'https:www.example-page-xl.com'
sauce = urllib.request.urlopen(web_url).read()
soup = bs.BeautifulSoup(sauce,'lxml')

section = soup.section

for url in section.find_all('a'):
    print urljoin(web_url,url.get('href'))

ici urljoin gère les chemins absolus et relatifs.

20
Somil

urllib.parse.urljoin () pourrait aider. Il fait une jointure, mais il est intelligent et gère les chemins relatifs et absolus. Notez que c'est python 3 code.

>>> import urllib.parse
>>> base = 'https://www.example-page-xl.com'

>>> urllib.parse.urljoin(base, '/helloworld/index.php') 
'https://www.example-page-xl.com/helloworld/index.php'

>>> urllib.parse.urljoin(base, 'https://www.example-page-xl.com/helloworld/index.php')
'https://www.example-page-xl.com/helloworld/index.php'
14
Andrei Cioara