2016-12-31 6 views
1

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

Все веб-сайты используют JS, чтобы показать цену, поэтому я пошел с селеном, чтобы очистить необходимые данные.

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

Я получил эти XPath с помощью FireFox и Firebug, Hoàwever я получаю errror, каждый раз я пытаюсь получить эти элементы с селеном (драйвер PhantomJS):

selenium.common.exceptions.NoSuchElementException: Message: {"errorMessage":"Una 
ble to find element with xpath './div'","request":{"headers":{"Accept":"applicat 
ion/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"89 
","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:51048","User 
-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\"usin 
g\": \"xpath\", \"sessionId\": \"27f41b80-cf63-11e6-bbcc-13b1a315759a\", \"value 
\": \"./div\"}","url":"/element","urlParsed":{"anchor":"","query":"","file":"ele 
ment","directory":"/","path":"/element","relative":"/element","port":"","host":" 
","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/ 
element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/27f41b80-cf 
63-11e6-bbcc-13b1a315759a/element"}} 

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

Вот два разных XPaths, что оба должны работать, (они с помощью FIRFOX, но не с селеном):

"id('regular-hero')/div[3]/div[1]/div[2]/div/div[1]/div/div/span" 

"/html/body/div[2]/div[3]/div[1]/div[2]/div/div[2]/div/div/span/text()[1]" 

А вот это целевая страница HTML код Here

И вот код, чтобы получить elemnts с помощью селена:

self.browser = wd.PhantomJS() 
for n in xrange(len(self.url_list)): 
    url = self.url_list[n] 
    provider = self.provider_list[n] 
    self.browser.get(url) 
    for plan in provider: 
     for hosting_plan in provider[plan]: 
      xpath = hosting_plan.values()[0] # Get the xpath of a plan 
      price_elem = self.browser.find_element_by_xpath("//*") 
      print price_elem 

self.browser.close() 

Все петли используются для обхода внешнего файла JSON, которые держат список XPATH.

Что не так? Что я должен попробовать? Может ли lxml помочь мне (учитывая, что HTML-код иногда нарушается)?

+0

Показать 'HTML' код целевого элемента – Andersson

+0

@ Andersson Я добавил ссылку на HTML-код целевой страницы. –

+0

Вы можете сделать интерактивный Selenium scrapping для проблемного объекта и экспортировать код в Python. Он должен указать вам, что вы делаете неправильно. – boardrider

ответ

2

Согласно предоставленной ссылке вы можете сопоставить необходимый элемент со следующими XPath:

//span[@class="term-price"] 

Если элемент генерируется с JavaScript вам нужно подождать некоторое время для элемента внешнего вида:

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, "//span[@class='term-price']"))) 
+0

Спасибо, но почему другие xpaths не будут работать? Они должны быть правильными, верно? У меня есть большой список xpaths, и это займет слишком много времени, чтобы переделать его. –

+0

Ваши «XPath'а являются абсолютными. Это означает, что они фиксированы и чувствительны к изменениям в 'DOM'. 'DOM' не является константой: он может быть изменен некоторыми событиями или выполнением' JavaScript'. Вы должны найти относительный 'XPath', который будет соответствовать всем вашим случаям без сильной привязки к' DOM' – Andersson

+0

Но мои ценовые элементы генерируются через JS, это повлияет на xpath? –

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