2

Seleniumとxpathsを使用していくつかのデータを取得しようとしています。

次のxpathは正常に機能します。

print sel.get_attribute("xpath=(//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href")

一致する4つのURLを返します。ここまでは順調ですね。

問題は、各URLを個別にターゲットにするxpathを作成したいということです。

Firefox xpathチェッカープラグインを使用して、次のコードが必要なものを正確に実行することを確認できました。

((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href)[1]

しかし、Firefox xpathチェッカーで作業しているにもかかわらず、Seleniumでこれを機能させることができないようです。

私が実行しようとするときはいつでも:

print sel.get_attribute("xpath=((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href)[1]")

次のエラーが発生します。

Exception: ERROR: Invalid xpath [2]: ((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a

ここで何が起こっているのかわからない。私は単純な間違いを犯していますか、それともSelenium xpathはFFxpathチェッカーのようにネストされたブラケットをサポートしていませんか?

私はこれに何時間も取り組んできて、それを機能させることができないように見えるので、どんな考えでも最もありがたいです:(

4

2 に答える 2

1

繰り返しますが、これはあなたの質問に対する答えではありません。しかし、私はこのようなxp​​athを使用することはありません。Webページの作成者がクラスを使用するのに十分賢い場合、彼はWebページの構造を変更してそれらのクラスを維持できるほど賢いです。

from selenium import webdriver
driver = webdriver.Chrome() 

series = driver.find_element_by_class_name("series")
series_links = [i.get_attribute('href') for i in series.find_elements_by_class_name("series_links")]

driver.quit() # call this when you're done using the webdriver.
于 2012-09-17T14:24:36.540 に答える
0

私の質問に対する答えではありませんが、同様の問題に遭遇する可能性のある人のための回避策を見つけました。

Seleniumのget_xpath_countコマンドを使用すると、比較的簡単なxpath検証が可能になります。間違ったxpath(または存在しないxpath)を指定すると、コマンドは単にゼロ( '0')を返します。

そのため、get_attributeコマンドを実行する前に、単純な「if」ステートメントを使用してxpathが存在することを確認しています。

if sel.get_xpath_count("(//*[@class='series_links'])[" + str(data) + "]//*[@class='youtube']") > 0:
    print sel.get_attribute("xpath=(//*[@id='course_list']/*[@class='series'])[" + str(data) +"]//*[@class='youtube']//a/@href")
于 2012-09-17T07:47:00.427 に答える