2017-10-05 9 views
0

私はいくつかの住宅価格を印刷しようとしており、Xpathの使用に問題があります。ここに私のコードは次のとおりです。xpathをより選択的にするには?

from selenium import webdriver 
driver = webdriver.Chrome("my/path/here") 

driver.get("https://www.realtor.com/realestateandhomes-search/?pgsz=10") 
for house_number in range(1,11): 
    try: 
     price = driver.find_element_by_xpath("""//*[@id=" 
{}"]/div[2]/div[1]""".format(house_number)) 
     print(price.text) 
    except: 
     print('couldnt find') 

私は最初の10軒の住宅の住宅価格オフ印刷しようと、thisウェブサイトにしています。

私の出力は、「NEW」と言われるすべての住宅のためのもので、実際の価格ではなく価格として取得されます。しかし、その新しいステッカーを持っていないボトム2では、実際の価格が記録されます。

Xpathセレクタを数字を選択するようにするにはどうすればいいですか?

答えて

0

あなたは正しい軌道に乗っています。あなたは壊れやすいXPathを作成しました。私はインデックスとワイルドカードに頼ることなく、もう少し冗長にしようとします。


ここにあなたのXPathは(私は例の目的のためにid="1"を使用)です:

//*[@id="1"]/div[2]/div[1] 

そして、ここでは、HTML(簡潔にするため削除いくつかの属性/要素)です:

<li id="1"> 
    <div></div> 
    <div class="srp-item-body"> 
     <div>New</div><!-- this is optional! --> 
     <div class="srp-item-price">$100,000</div> 
    </div> 
</li> 

最初に、を含める予定の要素に*ワイルドカードを置き換えます。これは、単純にXPathが少し良く「自己文書を」助ける方法としての役割を果たす:

//li[@id="1"]/div[2]/div[1] 

次に、あなたが二<div>をターゲットにしたいが、代わりにインデックスで検索するのでは、要素の属性を使用するようにしてくださいこのようclassとして、該当する場合:

//li[@id="1"]/div[@class="srp-item-body"]/div[1] 

最後に、あなたは価格で<div>をターゲットにします。 「新規」テキストは自分の<div>だから、<div>ではなく、最初の<div>( "New")をターゲットにしたXPathです。しかし、「新規」テキスト<div>が存在しなかった場合、XPathは機能しました。

前の手順と同様の方法で、属性別にターゲットを設定できます。これは、常に価格で<div>をターゲットとするXPathを強制的に:

//li[@id="1"]/div[@class="srp-item-body"]/div[@class="srp-item-price"] 

は、この情報がお役に立てば幸い!


そう...あなたは価格と他には何もでちょうど興味を持っている場合はそのすべてを言った、これはおそらくも働くだろう:)

for price in driver.find_elements_by_class_name('srp-item-price'): 
    print(price.text) 
+0

ご協力いただきありがとうございました。私は解説と丁寧な説明に感謝します。しかし、そのコードを実行しようとすると、セレニウムがその要素を(つまり、どの家でも)見つけることができないというエラーが表示されます。 私のコードを次のように変更しました: 'price = driver.get_element_by_xclass(" "" li "@id =" {} "]/div [@ class =" srp-item-body "]/div [@class = "srp-item-price"] "" "。フォーマット(house_number))' \t これは、要素が毎回見つからないという例外をスローします。 – thewhitetie

+0

これはChromeのコンソールで動作しています。あなたは 'driver.find_element_by_xpath'を使ってみましたか? –

1

あなたはこのようにそれを書くことができ、画像をロードせずに、自分のフェッチ速度を向上させることができ

from selenium import webdriver 
# Unloaded image 
chrome_opt = webdriver.ChromeOptions() 
prefs = {"profile.managed_default_content_settings.images": 2} 
chrome_opt.add_experimental_option("prefs", prefs) 
driver = webdriver.Chrome(chrome_options=chrome_opt,executable_path="my/path/here") 
driver.get("https://www.realtor.com/realestateandhomes-search/Bladen-County_NC/sby-6/pg-1?pgsz=10") 
for house_number in range(1,11): 
    try: 
     price = driver.find_element_by_xpath('//*[@id="{}"]/div[2]/div[@class="srp-item-price"]'.format(house_number)) 
     print(price.text) 
    except: 
     print('couldnt find') 
+0

私は上記と同じ解決策を見つけました。 – Sagar007

0

あなたはこのコードを試すことができます:

from selenium import webdriver 
driver = webdriver.Chrome() 
driver.maximize_window() 
driver.get("https://www.realtor.com/realestateandhomes-search/Bladen-County_NC/sby-6/pg-1?pgsz=10") 

prices=driver.find_elements_by_xpath('//*[@class="data-price-display"]') 

for price in prices: 
    print(price.text) 

それは

$39,900 
$86,500 
$39,500 
$40,000 
$179,000 
$31,000 
$104,900 
$94,900 
$54,900 
$19,900 
01を印刷します

その他の詳細が必要な場合は教えてください

関連する問題