2016-12-31 1 views
1

私は、数多くの異なるウェブサイトから価格を掻き集める必要があるスクレーパーを構築しています。PhantomJSを使用してこのxpathが機能しないのはなぜですか?

すべてのウェブサイトでJSを使用して価格を表示するので、必要なデータをスクレイプするためにセレンを使用しました。

スクレイパーの構築を開始する前に、私は外部ファイルでスクラップしていたURLごとにprice要素を取得するために必要なxpathのリストを作成しました。

私は、私がerrrorを取得し、FirefoxとFirebugは、Hoàweverを使用して、私はセレン(PhantomJSドライバ)でこれらの要素を取得しようとするたびに、これらのXPathを得た:

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が間違っているようだ、しかし、I他のプラグインを使用してそれをダブルチェックし、Firefox上でそのxpathをテストするたびに正しいです。

ここ

は両方が動作するはず二つの異なるのXPath、(彼らは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

だとここですすべてのループはXPathのリストを保持するJSON外部ファイルをトラバースするために使用されている

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() 

:セレンを使用してelemntsを取得するためのコード。

どうしたのですか?私は何を試すべきですか? lxmlは私を助けますか(HTMLコードが時折壊れていることを考えれば)?

+0

ショー 'HTML'ターゲット要素のコード – Andersson

+0

@AnderssonターゲットページのHTMLコードへのリンクを追加しました。 –

+0

問題のあるオブジェクトに対してインタラクティブなセレニウムスクラップを行い、コードをPythonに書き出すことができます。あなたが間違っていることを指摘する必要があります。 – boardrider

答えて

2

あなたがXPathを以下に必要な要素を一致させることができます提供リンクによると:あなたの要素はJavaScriptで生成された場合は、要素の出現のためにいくつかの時間を待つ必要が

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

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'の実行によって変更される可能性があります。 DOMと強い結びつきを持たないすべてのケースに対応する相対XPathが見つかります。 – Andersson

+0

しかし、私の価格エレメンツはJSを通して生成されますが、それはXPathに影響しますか? –

関連する問題