2015-11-20 3 views
0

Я хотел бы извлечь URL-адрес из xpath, используя пакет запросов в python. Я могу получить текст, но ничего, что я пытаюсь, дает URL. Может ли кто-нибудь помочь?Извлечение URL-адреса href с запросами Python

ipdb> webpage.xpath(xpath_url + '/text()') 
['Text of the URL'] 
ipdb> webpage.xpath(xpath_url + '/a()') 
*** lxml.etree.XPathEvalError: Invalid expression 
ipdb> webpage.xpath(xpath_url + '/href()') 
*** lxml.etree.XPathEvalError: Invalid expression 
ipdb> webpage.xpath(xpath_url + '/url()') 
*** lxml.etree.XPathEvalError: Invalid expression 

Я использовал этот учебник, чтобы начать работу: http://docs.python-guide.org/en/latest/scenarios/scrape/

Похоже, что это должно быть легко, но ничего не приходит во время моего поиска.

спасибо.

+0

Можете ли вы предоставить значение xpath_url? В первой строке выглядит так, что xpath интерпретируется правильно, но следующие утверждения xpath могут быть неверными. – jeedo

+0

@jeedo Ваш комментарий помог мне понять, что мой xpath закончил с «div/h2/a», и поэтому добавление просто '/ @ href' в соответствии с ответом Джеремии будет достаточным. Спасибо. –

ответ

2

Вы пробовали webpage.xpath(xpath_url + '/@href') ?

Вот полный код:

from lxml import html 
import requests 

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html') 
webpage = html.fromstring(page.content) 

webpage.xpath('//a/@href') 

Результат должен быть:

[ 
    'http://econpy.pythonanywhere.com/ex/002.html', 
    'http://econpy.pythonanywhere.com/ex/003.html', 
    'http://econpy.pythonanywhere.com/ex/004.html', 
    'http://econpy.pythonanywhere.com/ex/005.html' 
] 
+0

Спасибо! '@ href' работает. Теперь мне нужно пойти и узнать, почему это 'text()' для текста и '@ href' для href. –

+0

Я считаю, что это потому, что '@' используется для ссылки на атрибуты элемента, а 'text()' возвращает содержимое выбранных узлов. – jeremija

0

Вы бы лучше обслуживаться с помощью BeautifulSoup:

from bs4 import BeautifulSoup 

html = requests.get('testurl.com') 
soup = BeautifulSoup(html, "lxml") # lxml is just the parser for reading the html 
soup.find_all('a href') # this is the line that does what you want 

Вы можете распечатать эту строку, добавьте его в списки и т.д. Для того, чтобы перебирать, используйте:

links = soup.find_all('a href') 
for link in links: 
    print(link) 
+0

Кажется, bs4 - популярный способ сделать это. В этом случае я хотел остаться с запросами python, но это, безусловно, полезно для будущих ссылок. Спасибо. –

Смежные вопросы