![](/img/trans.png)
[英]Python Selenium Webscraping: find_elements_by_xpath returning an empty list
[英]Unable retrieve a list of elements using find_elements_by_xpath in selenium using python
我試圖做一個機器人,使用它的xapth從網站上檢索鏈接列表,然后單擊所有鏈接。
中的XPath看起來是這樣的: [@class="gridicons"]/li[i]/div/ul/li/p/a
和i
在li[i]
是從1
到n
, n
是數量鏈接存在。
該代碼段是:
urls=driver.find_elements_by_xpath('//[@id="gridicons"]/ul/li/div/ul/li/p/a')
for url in urls:
driver.execute_script("window.open(arguments[0]);",url.get_attribute("href"))
當find_elements_by_xpath
返回一個列表並將其存儲在urls
這可以很好地工作。 在這種情況下,如果您看一下xpath,則每個分區只有一個與之關聯的URL。 這是供參考的圖像。
但是,如果每個分區有一個以上的鏈接,則xpath會變為如下所示: //*[@class="gridicons"]/li[i]/div/ul/li[j]/p/a
其中i
構成塊數, j
是每個塊中的鏈接數。
如果我使用代碼:
urls = driver.find_elements_by_xpath('//*[@class="gridicons"]/li/div/ul/li[1]/p/a') print(urls)
為了只檢索每個塊上的第一個鏈接,當我打印網址時,它是一個空列表。 我不明白為什么,因為檢查元素框向我顯示了URL列表,從而使xpath有效。 這是圖片。
之所以沒有收到元素列表,是因為您使用的是絕對xpath。 這意味着該xpath將導致精確到1個元素。
您需要做的是為此元素創建一個相對的xpath。 如果您要添加多個a
元素的html代碼,我可以為您提供幫助。
替換相對路徑的絕對路徑(注意塊的“ li”之前的雙斜杠):
urls = driver.find_elements_by_xpath('//*@class="gridicons"]//li/div/ul/li[1]/p/a')
這應該給您所有塊<li>中的每個第一個<li>
根據WebElement
單個URL的代碼塊,以下xpath
可以工作:
//[@id="gridicons"]/ul/li/div/ul/li/p/a
現在,每個分區有多個鏈接,您還必須覆蓋以下xpath
標識WebElements
位置:
//*[@class="gridicons"]/li[i]/div/ul/li[j]/p/a
為了有效遍歷所有<li>
祖先,您可以使用以下代碼塊:
urls = driver.find_elements_by_xpath("//[@id='gridicons']/ul//li/div/ul//li/p/a")
for url in urls:
driver.execute_script("window.open(arguments[0]);",url.get_attribute("href"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.