我正在嘗試將來自網站的汽車鏈接附加到串列中。我想遍歷該串列以從每個汽車的網頁中獲取資訊。
到目前為止,我已經嘗試了 .append 方法和 = 運算子方法,但是我得到了相同的錯誤:
AttributeError: 'str' object has no attribute 'get_attribute'
這僅在我使用以下代碼行時顯示:
carLinks = [carLink.get_attribute("href")]
或append方法。但是,如果我只是列印carLink.get_attribute("href")然后它會列印所有鏈接。
這是我使用的部分代碼:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.tred.com/buy?body_style=&distance=50&exterior_color_id=&make=&miles_max=100000&miles_min=0&model=&page_size=24&price_max=100000&price_min=0&query=&requestingPage=buy&sort=desc&sort_field=updated&status=active&year_end=2022&year_start=1998&zip=")
carLinks = []
carLinks = driver.find_elements_by_css_selector("div.grid-box-container a")
for carLink in carLinks:
carLinkUrl = carLink.get_attribute("href")
carLinks.append(carLinkUrl)
# print(carLinkUrl)
print(carLinks)
driver.quit()
我還沒有在 BeautifulSoup 中嘗試過,因為我不習慣同時混合 Selenium 和 BeautifulSoup。
uj5u.com熱心網友回復:
您必須添加一個等待/延遲,讓頁面元素在訪問之前加載。
沒有driver.find_elements_by_css_selector("div.grid-box-container a")在driver.get("https://www.tred.com/buy?body_style=&distance=50&exterior_color_id=&make=&miles_max=100000&miles_min=0&model=&page_size=24&price_max=100000&price_min=0&query=&requestingPage=buy&sort=desc&sort_field=updated&status=active&year_end=2022&year_start=1998&zip=")回傳后立即獲取傳遞到carLinks.
這應該更好地分叉:
rom selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(ChromeDriverManager().install())
wait = WebDriverWait(driver, 20)
driver.get("https://www.tred.com/buy?body_style=&distance=50&exterior_color_id=&make=&miles_max=100000&miles_min=0&model=&page_size=24&price_max=100000&price_min=0&query=&requestingPage=buy&sort=desc&sort_field=updated&status=active&year_end=2022&year_start=1998&zip=")
carLinks = []
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.grid-box-container a")))
carLinks = driver.find_elements_by_css_selector("div.grid-box-container a")
for carLink in carLinks:
carLinkUrl = carLink.get_attribute("href")
carLinks.append(carLinkUrl)
# print(carLinkUrl)
print(carLinks)
driver.quit()
uj5u.com熱心網友回復:
這是因為您有一個串列,名稱是carLinks。同樣在你的回圈中:
for carLink in carLinks:
carLinkUrl = carLink.get_attribute("href")
carLinks.append(carLinkUrl)
您具有與 Web 元素相同的名稱。
編譯器會認為carLinks是web element因為區域作用域。
因為carLinks是locally a web element,所以append在Selenium 中沒有可用的方法。
請更改其中一個名稱。
carLinks = []
links = driver.find_elements_by_css_selector("div.grid-box-container a")
for car_link in links:
carLinks.append(car_link.get_attribute('href'))
print(carLinks)
uj5u.com熱心網友回復:
我注意到您的串列“carLinks”與 driver.find 的名稱相同。所以首先該名稱指的是一個串列,您可以附加到該串列。但是在你這樣做之前,你使用 selenium 將變數更改為一個 web 元素(我認為它是一個字串)。
這可能是問題嗎?我建議重命名該串列。
快速旁注,檢查網站是否允許網頁抓取。我記得一個叫做 autoscout 的網站在做類似的事情時遇到了一些法律問題。
uj5u.com熱心網友回復:
所以我找到了這個鏈接,他使用range()for 回圈而不是迭代網頁鏈接(物件)串列。可能存在一些像 Cruisepandey 所說的本地范圍問題,或者可能像 Pandey 所說的延遲太短。它現在作業正常。
我把代碼改成這樣:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.tred.com/buy?body_style=&distance=50&exterior_color_id=&make=&miles_max=100000&miles_min=0&model=&page_size=24&price_max=100000&price_min=0&query=&requestingPage=buy&sort=desc&sort_field=updated&status=active&year_end=2022&year_start=1998&zip=")
carLinks = []
carLinks = driver.find_elements_by_css_selector("div.grid-box-container a")
for i in range(len(carLinks)):
carLinks.append(carLinks[i].get_attribute('href'))
print(carLinks)
driver.quit()
甚至洗掉了carLink變數以使其更短。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313839.html
下一篇:Xpathpython包含值
