@wanomgn

Парсим страницу. Как из относительного урла получить полный урл?

Приветствую
простейшая прога дергает определенный урл и выводит список встретившихся там урлов.
import urllib.parse
import requests
from lxml import html

response = requests.get('http://lenta.ru/')
parsed_body = html.fromstring(response.text)
for y in parsed_body.xpath("//a"):
    url=y.get("href")
    print(url)


Получаем примерно такое:
lenta.ru/rubrics/ww1
age.lenta.ru/generation
/rubrics/life/
/parts/text/
/parts/photo/

в данном примере 2 первых урла в полном виде а три последних в относительном.
как "красивше" получить все урлы в полном виде?
  • Вопрос задан
  • 2348 просмотров
Пригласить эксперта
Ответы на вопрос 4
@xandox
https://docs.python.org/2/library/urlparse.html#ur...

Там много чего может встретиться, лучше готовым пользоваться сразу
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
if not url.startswith("http:"):
  url = baseUrl + url
Ответ написан
Комментировать
@m0ody
backend dev (python, django, postgresql, celery)
import urlparse

chunks = urlparse.urlparse('/path/?query=1')
if not chunks.netloc:
     # относительный url
     chunks = list(chunks)
     chunks[1] = 'lenta.ru'
     print urlparse.urlunparse(chunks)
Ответ написан
Комментировать
vvpoloskin
@vvpoloskin
Инженер связи
Вариантов много, вот нативный код без импорта библиотек. baseurl должен быть в полном виде с указанием протокола.
def geturl(href, baseurl):
   domain = [i for i in baseurl.split('/') if i][1]
   proto = [i for i in baseurl.split('/') if i][0]
   protos = ['https://', 'http://', 'ftp://',]
   for i in protos:
      if href.startswith(i):
          return href
   if href.startswith('/'):
      return proto + '://' + domain + href
   if baseurl.endswith('/'):
      return baseurl + href
   return '/'.join(baseurl.split('/')[:-1]) + url
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы