2014-12-10 9 views
0

Мне нужно разобрать html-страницу, которая ищет ссылки в ней. К сожалению, ссылки не содержат полный URL (например, начиная с «http://www.example.com/aResource.html»). Так что мой разборе получить только относительный URL, для получить весь адрес URL-адрес, я используюPython parsing html для полных ссылок urls

urlparse.urljoin() 

Но часто это приводит к некоторым ошибкам соединения, и в целом я бы предпочел прямой способ извлечь ссылку comlplete URL. Вот мой код:

import urlparse 
import requests 
from lxml import html 
from lxml import etree 

aFile = requests.get(url) 
tree = html.fromstring(aFile.text) 

linkList = tree.xpath('//a') 

urls = [] 

for link in linkList: 
    urls.append(str(urlparse.urljoin(url,link.get('href')))) 

Как вы можете видеть, я работаю с LXML, но я также пытался с BeautifulSoup без успеха.

+0

, что это адрес? –

+0

Возможный дубликат: http://stackoverflow.com/questions/717541/parsing-html-in-python?rq=1 – nchen24

+0

@PadraicCunningham URL-адрес выглядит следующим образом: http://example.com/path/0VPZUJL06JKS/U09R71 .html. И в теге link указан только элемент из последнего «/» – accand

ответ

0

Поскольку информация (схема URL, хост-сервер, порт, путь - базовый URL) отсутствует в <a href=""...>, ее необходимо добавить к относительному URL-адресу.

Обычно вы используете urlparse.urljoin(), как вы уже делаете.

HTML позволяет специфицировать базовый url для страницы с использованием тега <base href="...">, который должен быть определен один раз в <head>. Если этот тег присутствует, вы должны использовать его атрибут href как ваш базовый URL для urljoin(). Ваш код может быть изменен следующим образом:

import urlparse 
import requests 
from lxml import html 
from lxml import etree 

aFile = requests.get(url) 
tree = html.fromstring(aFile.text) 

linkList = tree.xpath('//a') 

urls = [] 

try: 
    base_url = tree.xpath('//base[1]/@href')[0] 
except IndexError: 
    base_url = url 

for link in linkList: 
    urls.append(str(urlparse.urljoin(base_url,link.get('href')))) 

Однако, если вы получаете ошибки соединения, казалось бы, что некоторые ссылки, являются недействительными. Правильный URL-адрес, полученный из URL-адреса страницы или из тега <base href="...">. Любые недопустимые URL-адреса, созданные с этим значением, должны быть связаны с неверным относительным URL-адресом (или недопустимым тегом <base>).

У вас есть конкретные примеры URL-адреса, используемые при ошибках соединения?

Вы также можете посмотреть на mechanize:

import mechanize 

br = mechanize.Browser() 
resp = br.open(url) 
urls = [link.absolute_url for link in br.links()] 
+0

Теперь он работает. Спасибо! – accand

+0

В чем была проблема? – mhawke