2017-01-08 7 views
0

У меня есть следующие XPaths:Cant найти элемент по XPath

<a class="btn btn-small downloadlink" rel="nofollow" data- 
toggle="tooltip" data-format="ico" data-icon-id="1715795" 
href="/icons/1715795/download/ico" data-original-title="Download this 
icon in ICO format for use in Windows."><i class="download-icon"></i><b> 
ICO</b></a> 

<a class="btn btn-small downloadlink" rel="nofollow" data- 
toggle="tooltip" data-format="icns" data-icon-id="1715795" 
href="/icons/1715795/download/icns" data-original-title="Download this 
icon in ICNS format for use in Apple OS X."><i class="download-icon"></i><b> 
ICNS</b></a> 

(отсюда: https://www.iconfinder.com/icons/1715795/earth_planet_space_icon#size=128)

Использование селена, я хочу, чтобы выбрать элемент, который соответствует XPath, который содержит:

data-format="icns" 

Я пытался что-то вроде:

driver.find_element_by_xpath('//*[@data-format="icns"]') 

, но он дает следующее сообщение об ошибке:

selenium.common.exceptions.NoSuchElementException: Message: no such 
element: Unable to locate element: {"method":"xpath","selector":"//* 
[@data-format=icns]"} 

Q: Как выбрать второй элемент?

Я знаю, что могу просто скопировать xpath из инспекции, но это оставило бы меня с очень неустойчивым скриптом скремблирования. Поскольку крошечные изменения в макете страницы могут означать, что мое выражение xpath больше не будет действительным.

Заранее благодарен!

+0

Что значит «не работает»? – Andersson

+0

Selenium can not find element with this xpath – titusAdam

+0

Вы пробовали с помощью css, чтобы узнать, является ли это ошибкой xpath, а не вопросом времени? 'a [data-format =" icns "]' –

ответ

0

Если вы хотите отказаться от сайта и загрузить какой-либо объект, я могу порекомендовать его использовать scrapy - он намного лучше/быстрее/надежнее для очистки, чем селен.

Например:

$ scrapy shell 
2017-01-08 23:36:58 [scrapy] INFO: Scrapy 1.2.1 started (bot: scrapybot) 
2017-01-08 23:36:58 [scrapy] INFO: Overridden settings: {'LOGSTATS_INTERVAL': 0, 'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter'} 
.... debug info .... 
2017-01-08 23:36:58 [scrapy] INFO: Enabled item pipelines: 
[] 
2017-01-08 23:36:58 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
[s] Available Scrapy objects: 
[s] scrapy  scrapy module (contains scrapy.Request, scrapy.Selector, etc) 
[s] crawler <scrapy.crawler.Crawler object at 0x10cfe7cc0> 
[s] item  {} 
[s] settings <scrapy.settings.Settings object at 0x10cfe7eb8> 
[s] Useful shortcuts: 
[s] shelp()   Shell help (print this help) 
[s] fetch(req_or_url) Fetch request (or URL) and update local objects 
[s] view(response) View response in a browser 

# fetch data and prepare all helpers to work 
>>> fetch('https://www.iconfinder.com/icons/1715795/earth_planet_space_icon#') 

# now object `response` contains result of our request 
>>> response 
<200 https://www.iconfinder.com/icons/1715795/earth_planet_space_icon> 

# let's check links: 
>>> response.xpath('//*[@data-format="icns"]') 
[<Selector xpath='//*[@data-format="icns"]' data='<a class="btn btn-small downloadlink" re'>, <Selector xpath='//*[@data-format="icns"]' data='<a class="btn btn-small downloadlink" 
re'>, <Selector xpath='//*[@data-format="icns"]' data='<a class="btn btn-small downloadlink" re'>, <Selector xpath='//*[@data-format="icns"]' data='<a class="btn btn-small downloadl 
ink" re'>, ...... ] 

# extract first of them 
>>> link = response.xpath('//*[@data-format="icns"]')[0] 
>>> link.extract() 
'<a class="btn btn-small downloadlink" rel="nofollow" title="Download this icon in ICNS format for use in Apple OS X." data-toggle="tooltip" data-format="icns" data-icon-id="1715795 
" href="/icons/1715795/download/icns"><i class="download-icon"></i><b>\n ICNS</b></a>' 

# URL of a link 
>>> link.select('@href').extract_first() 
'/icons/1715795/download/icns' 

# add host and other params to form a full URL 
>>> response.urljoin(link.select('@href').extract_first()) 
'https://www.iconfinder.com/icons/1715795/download/icns' 

В самом деле Scrapy способен на многое-многое другое. Например, он может рекурсивно находить и загружать все ссылки для вас.

+0

Привет, Евгений, я работал со скрипом! Тем не менее, мне нужно selenium для загрузки материалов с веб-сайта, на котором используется javascript (не в этом примере). – titusAdam

+0

Да, Scrapy не поддерживает JS напрямую. Вы пробовали [PhantomJS] (http://phantomjs.org/) или [Scrapy-splash] (https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash /) подготовить страницы для Scrapy? –

+0

Нет, я не хочу, я сделаю это!Вы знаете, есть ли такой пакет, как scrapy для java? – titusAdam

0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import requests 
import lxml.html 

url = "https://www.iconfinder.com/icons/1715795/earth_planet_space_icon#size=128" 

#if you use selenium, comment this line. 
resp = requests.get(url) 

#you can replace this line if you use selenium 
#source_code = browser.page_source 

source_code = resp.text 

root = lxml.html.fromstring(source_code) 

id_icon = set(root.xpath('//*[@data-format="icns"]//@data-icon-id')) 

#just if you want download all the icons 

for id in id_icon: 
    url = 'https://www.iconfinder.com/icons/{0}/check-download/icns'.format(id) 

    local_filename = '{0}.icns'.format(id) 
    resp = requests.get(url, stream=True) 
    with open(local_filename, 'wb') as f: 
     for chunk in resp.iter_content(chunk_size=1024): 
      if chunk: 
       f.write(chunk) 

    print "downloaded {0}".format(local_filename) 
Смежные вопросы