2015-01-16 4 views
-2

Я ищу для XPath, чтобы получить HREF отЧто такое xpath, чтобы получить href здесь?

<a class="a-link-normal s-access-detail-page a-text-normal" title="Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)" href="http://rads.stackoverflow.com/amzn/click/B00HQDBLDO"><h2 class="a-size-base s-inline s-access-title a-text-normal">Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)</h2></a> 

Я попытался следующий код:

url = "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=digital+camera&rh=i%3Aaps%2Ck%3Adigital+camera" 
page = requests.get(url) 
tree = html.fromstring(page.text) 
hrefs = tree.xpath('//*/a/@href') 
for href in hrefs: 
    if "keywords=digital+camera" in href: 
     print href 

Ничего не печатается здесь.

Я не уверен, может ли xpath это сделать? Вот ссылка: http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera

+0

Есть несколько способов, чтобы достичь его XPath. Поскольку мы не видим полный HTML-код (или ссылку), мы не знаем, насколько надежным будет выражение. Кроме того, почему вопрос помечен Python? – alecxe

+0

@alecxe вопрос обновлен. thx – c20ad4d76fe97759aa27a0c99bff67

+0

Спасибо. Что у вас есть в качестве входных данных? Я имею в виду, что название ссылки - это то, на что вы можете положиться? – alecxe

ответ

0

попробуйте это. Но всегда хорошо, если вы попробуете разные вещи, а затем зададите вопрос, если вы где-то попали.

//a[@title='Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)'] 
+0

Мне нужно получить все hrefs. Пожалуйста, прочитайте мой вопрос еще раз. – c20ad4d76fe97759aa27a0c99bff67

+0

Но в сообщении есть один href. Между тем попробуйте это // a [@ class = 'a-link-normal s-access-detail-a-a-text-normal']/@ href Он получит все hrefs этого класса. – Ravikumar

+0

Мне нужно получить все href в этой ссылке, закончившейся словами «keywords = digital + camera» – c20ad4d76fe97759aa27a0c99bff67

0

Реальная проблема не «как получить ссылки по XPath», но «как получить HTML-код, который содержит ссылки, которые должны быть получены с помощью XPath» есть.

Амазонка, которую вы видите в браузере, была построена им несколькими дополнительными асинхронными вызовами и выполнением javascript. HTML, который вы получаете в page.text, полностью отличается от того, что вы увидите в браузере. Он не содержит нужных ссылок, так как requests не является браузером, по крайней мере, не существует встроенного javascript engine.

Самым простым решением здесь было бы автоматизировать реальный браузер с помощью selenium:

from selenium import webdriver 

driver = webdriver.Firefox() 
driver.get('http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera') 

for link in driver.find_elements_by_xpath('//a[contains(@href, "keywords=digital+camera")]'): 
    print link.get_attribute('href') 

driver.close() 
+0

Я хорошо работаю на Mac или ПК.Но этот soluntion не мог работать в экстазе ec2, поскольку графическая поддержка отсутствует. Как я мог обойти это? – c20ad4d76fe97759aa27a0c99bff67

+0

@ c20ad4d76fe97759aa27a0c99bff67 phantomjs headless browser ('webdriver.PhantomJS') или виртуальный дисплей (см.' Xvfb') - обычные решения/обходные пути. – alecxe

+0

В качестве альтернативы вы можете попытаться подделать заголовок 'User-Agent', возможно, этого достаточно, чтобы обмануть Amazon, предоставив вам версию браузера на странице. Более разумным вариантом было бы думать, если вы действительно нуждаетесь в ссылках, в которых есть ключевое слово в них, или если вы все еще можете решить свою задачу, не слишком полагаясь на «href-формат», определенный браузером Amazon. – Tomalak

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