0

Selenium を使用して Python で webcrawler を構築しています。以下は、リンクを検索する関数です。コメントアウトされた部分を除いて、正常に動作します。アイデアは、調査中のページで見つかった各リンクにカーソルを合わせるというもので、そのホバリング アクションによってさらに多くのリンクが表示された場合 (たとえば、Javascript で作成されたドロップダウン メニューなど)、getLinksFromHTML ( 「if code != 1」の部分は、再帰呼び出しが 1 つだけであることを確認するためのものです)。

ただし、JSドロップダウンメニュー内にリンクがあるページでテストすると、再帰呼び出しは新しいリンクを取得しません(私が見ているページはhttp://wilmingtontaxesandaccounting.comです)。表示されているリンクはすべて正常に取得されます。

Selenium がこれらのドロップダウン リンクを認識できるようにするにはどうすればよいですか? 一般的な解決策が必要です。つまり、特定の要素 ID や、コードにハードコードされたページ固有のものは必要ありません。読んでくれてありがとう!

def getLinksFromHTML(currUrl, code):

    ListlinkerHref = browser.find_elements_by_xpath("//*[@href]")
    links1 = []
    links2 = []

    for link in ListlinkerHref:
        url = link.get_attribute("href")

        #hov = ActionChains(browser).move_to_element(link)
        #hov.perform()
        #if code != 1:
            #links1 = self.getLinksFromHTML(currUrl, 1)

        if url not in links1:
            links2.append(url)

    return links1 + links2  
4

1 に答える 1

2

動作しなかった理由は、私が Firefox ドライバーを使用していたためであることがわかりました。どうやら Firefox では、move_to_element は実際には要素にカーソルを合わせるのではなく、そこに「フォーカス」するだけです。Chrome ドライバーに切り替えると、実際にメニュー項目の上にカーソルを置き、サブメニューを表示しました。(実際の関数にはいくつかのエラーがあることに注意してください。ただし、それはこの質問のポイントではありません。)

TL;DR: Selenium Webdriver を使用していて、リンクにカーソルを合わせてサブメニューなどのコンテンツを表示したい場合は、Firefox ではなく Chrome を使用してください。

于 2013-06-23T05:26:26.033 に答える