Python Selenium WebDriver「いいえ要素なし」 -- python フィールド と selenium フィールド と webdriver フィールド 関連 問題

python selenium webdriver “no such element”












0
vote

問題

日本語

動的ページからタイトルを拾うために単純なスクレイディングループを作ろうとしています。私は私が期待している方法で働く小さなスクリプトを作りました。これが作業スクリプトです:

<事前> <コード> from selenium import webdriver driver = webdriver.Chrome('C:/Users/user/Downloads/chromedriver_win32/chromedriver.exe') url = "https://www.youtube.com/user/LinusTechTips/videos" driver.get(url) videos = driver.find_elements_by_xpath('.//*[@id="dismissable"]') for video in videos: title = video.find_element_by_xpath('.//*[@id="video-title"]').text print(title)

タイトルやその他の詳細を含むDIVを介して正しくクロールされ、タイトルを削除します。しかし、このスクリプトはYouTubeで動作しているようです。私はCraigslist、Amazon、Bookstoscrepe、rightMove、およびHostelworldでそれを試しましたが、それらのページのどれでも機能していないようです。これがHostelWorldのスクリプトです:

<事前> <コード> from selenium import webdriver driver = webdriver.Chrome('C:/Users/user/Downloads/chromedriver_win32/chromedriver.exe') url = "https://www.hostelworld.com/s? q=New%20York,%20New%20York,%20USA&country=USA&city=New%20York&type=city&id=13&from=2020-08- 14&to=2020-08-16&guests=2&page=1" driver.get(url) cards = driver.find_elements_by_xpath('.//*[@id="__layout"]/div/div[1]/div[4]/div/div/div[3]') for card in cards: title = card.find_element_by_xpath('.//* [@id="__layout"]/div/div[1]/div[4]/div/div/div[3]/div[2]/div[1]/h2/a').text print(title)

Chrome Dev Toolsでの検索でカードクラス名がそれを見つけるのが正しいと確信しています。ループの外部で使用しても正しく印刷されているため、タイトルXPathが正しく印刷されていると思います。カードを変数に変更すると、ループが正しいと思います。

<事前> <コード> cards = driver.find_elements_by_class_name('property-card')

ページ上のすべてのカードに対してタイトルを1回印刷します。

しかし、 . をタイトルXPathに追加すると、 "message:noのような要素:要素を見つけることができません:..."というエラーが返されます。 . を使用して式を入力して、ページ全体ではなく繰り返される親要素を検索するだけです。しかし何らかの理由で . を追加する

を除いて、私が試みたすべてのWebサイトでエラーをスローします。

私はすべてのWebサイトが良いクラスとID規則を持っているわけではないため、できるだけXPathに固執しようとしています。

英語

I'm trying to make a simple scraping loop to pick up titles from dynamic pages. I've made a small script that works the way I expected. Here is the working script:

from selenium import webdriver driver = webdriver.Chrome('C:/Users/user/Downloads/chromedriver_win32/chromedriver.exe')  url = "https://www.youtube.com/user/LinusTechTips/videos" driver.get(url)  videos = driver.find_elements_by_xpath('.//*[@id="dismissable"]')  for video in videos:         title = video.find_element_by_xpath('.//*[@id="video-title"]').text         print(title) 

It correctly crawls through divs containing titles and other details and scrapes titles. But this script only seems to work on youtube. I've tried it on craigslist, amazon, bookstoscrape, rightmove and hostelworld but it doesn't seem to work on any of those pages. Here is the script for hostelworld:

from selenium import webdriver driver = webdriver.Chrome('C:/Users/user/Downloads/chromedriver_win32/chromedriver.exe')  url = "https://www.hostelworld.com/s?  q=New%20York,%20New%20York,%20USA&country=USA&city=New%20York&type=city&id=13&from=2020-08-  14&to=2020-08-16&guests=2&page=1"  driver.get(url)  cards = driver.find_elements_by_xpath('.//*[@id="__layout"]/div/div[1]/div[4]/div/div/div[3]')  for card in cards:     title = card.find_element_by_xpath('.//*      [@id="__layout"]/div/div[1]/div[4]/div/div/div[3]/div[2]/div[1]/h2/a').text     print(title) 

I'm pretty sure the cards class name is correct from finding it with a search in Chrome dev tools. I think title xpath is correct because it prints correctly if I use it outside the loop. I think the loop is correct too because if I change the cards variable to:

cards = driver.find_elements_by_class_name('property-card') 

it prints title once for every card on the page.

But when I add . to the title xpath it returns an error saying "Message: no such element: Unable to locate element: ...". I'm using . to prepend the expression so it only searches the parent element getting iterated through, not the whole page. But for some reason adding . throws the error on all websites I tried except youtube.

I'm trying to stick to xpaths as much as possible because not all websites have good class and id conventions.

</div
        
     
     

回答リスト

1
 
vote
vote
ベストアンサー
 

all properties.induce WebDriverWait ()を取得し、 visibility_of_all_elements_located ()を待ち、 css selecor 。 <コード> url = "https://www.hostelworld.com/s?q=New%20York,%20New%20York,%20USA&country=USA&city=New%20York&type=city&id=13&from=2020-08-14&to=2020-08-16&guests=2&page=1" driver.get(url) cards=WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"div.property-card h2.title.title-6>a"))) for card in cards: title = card.text print(title)

出力

<事前> <コード> The Local NYC HI NYC Hostel NY Moore Hostel Broadway Hotel n Hostel Q4 Hotel American Dream Hostel Giorgio Hotel Freehand New York West Side YMCA Hotel 31 Vanderbilt YMCA Union Hotel Brooklyn Victorian Inn Central Park West Hostel Jazz on the Park Youth Hotel The Jane Nesva Hotel John Hotel

ライブラリの下にインポートする必要があります。

<事前> <コード> from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By

価格で更新されました。

<事前> <コード> %pathtofolder%0

出力

<事前> <コード> %pathtofolder%1

 

To Get the title of all properties.Induce WebDriverWait() and wait for visibility_of_all_elements_located() and following css selecor.

url = "https://www.hostelworld.com/s?q=New%20York,%20New%20York,%20USA&country=USA&city=New%20York&type=city&id=13&from=2020-08-14&to=2020-08-16&guests=2&page=1" driver.get(url) cards=WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"div.property-card h2.title.title-6>a"))) for card in cards:     title = card.text     print(title) 

Output:

The Local NYC HI NYC Hostel NY Moore Hostel Broadway Hotel n Hostel Q4 Hotel American Dream Hostel Giorgio Hotel Freehand New York West Side YMCA Hotel 31 Vanderbilt YMCA Union Hotel Brooklyn Victorian Inn Central Park West Hostel Jazz on the Park Youth Hotel The Jane Nesva Hotel John Hotel 

Please note you need to import below libraries.

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

Updated with price.

url = "https://www.hostelworld.com/s?q=New%20York,%20New%20York,%20USA&country=USA&city=New%20York&type=city&id=13&from=2020-08-14&to=2020-08-16&guests=2&page=1" driver.get(url) cards=WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"div.property-card"))) for card in cards:      try:        title = card.find_element_by_css_selector("h2.title.title-6>a").text        print(title)        price=card.find_element_by_css_selector("p.price.title-5").text        print(price)     except:       continue 

Output:

The Local NYC €45 HI NYC Hostel €41 NY Moore Hostel €158 Broadway Hotel n Hostel €73 Freehand New York €95 Q4 Hotel €37 Giorgio Hotel €158 American Dream Hostel €128 West Side YMCA €87 Vanderbilt YMCA €89 Hotel 31 €74 Union Hotel Brooklyn €128 Victorian Inn €88 Central Park West Hostel €42 The Jane €115 Jazz on the Park Youth Hotel €78 Nesva Hotel €136 John Hotel €165 
</div
 
 
         
         

関連する質問

5  Selenium WebDriver - マウスの右ボタンを押す方法は?  ( Selenium webdriver how to holds down the right mouse button ) 
Selenium 2.0 WebDriver(Java)を使用する(Java)、いくつかのナビゲーションをテストする必要があります(回転、パン...) マウスを動かしながら右ボタンを押すことができる必要があります。 同様に、マウスを動かしながらミドルボタンを...

0  RemoteWebDriver(Firefox)はXPathでは機能しません  ( Remotewebdriverfirefox doesnt work with xpath ) 
Google.com上のXPathロケーターでRemoteWebDriverを使用しようとしていますが、これはFirefoxを実行しているノードからのログです。これらのコマンドをすべて受け取りますが、それらを実行しません。 Googleホームページを開く以外...

0  クリック可能なポイント(Selenium)  ( Not clickable point selenium ) 
私は「もっと見る」ボタンをクリックしようとしていますが、できません。 助け?ありがとうございました。 <事前> <コード> DataGridView1 ...

8  selenium-webdriverと読み込むページを待ちます  ( Selenium webdriver and wait for page to load ) 
簡単なテストを書いています。私の問題は、ページが完全にロードされるまで待ちたいことです。現時点では、いくつかの要素が存在するまで待っていますが、それは実際に私が欲しいものではありません。このようなものを作ることは可能です: <事前> <コード> <SafeAr...

0  スクリプト内にAbstractWebDriveReventListenerを実装する方法  ( How to implement abstractwebdrivereventlistener in a script ) 
私は SeleniumTestListener.java という名前のファイルを作成し、以下のコードを書きました: <事前> <コード> @override @AfterMethod(alwaysrun=true) public class UITestNGL...

1  これが見つからない場合はどうすれば... selenium node.js  ( How to do an if this is not found then selenium node js ) 
これは愚かな質問かもしれませんが、これが見つからない場合はどうすればいいですか。私は私が使わなければならないことを知っています!==私はそれを私の訴訟で処理する方法がわからない...ここにコード: <事前> <コード> if (driver.findElem...

6  Python Selenium WebDriver - ドライバは突然「ダイ」と終了できません、current_url、ページを開く  ( Python selenium webdriver driver suddenly dies and cant quit get current u ) 
、私のスクリプトの途中で、私のWebDriverインスタンスは die ! とそれ以降、私はその方法のいずれかを呼び出すことができません。 例: <事前> <コード> >>> spsel.driver.current_url Traceback (most ...

1  WebDriverを使用した古いGoogle Chromeオートメーション  ( Old google chrome automation using webdriver ) 
私は最新版までのGoogle Chrome Old Versionsを自動化する必要があります。 Chromedriverがバージョン13以降から入手可能であることがわかります。これらの古いバージョンの場合はどこで見つけることができますか? WebDrive...

5  Selenium WebDriverウィンドウはC#スイッチが失敗しました  ( Selenium webdriver window handles c sharp switchto failed ) 
ここにはテスト中に2つのウィンドウが表示されます。 マイコード: <事前> <コード> private void Foo() { // do stuff with MY_DICTIONARY MY_DICTIONARY = null // ? ...

21  PythonとWebDriverを使用したアサート/ verifyElementPresent?  ( Assert verifyelementpresent with python and webdriver ) 
SeleniumからWebDriverへの変更とそのそれぞれの文書に混乱することができます。ドキュメントのテストデザインについてのセクションでは、 assert vser アサテルメントプラステントなど。ただし、WebDriverのチュートリアルを通過し、セ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有