Я пытаюсь добавить автомобильные ссылки с веб-сайта в список. Я хочу просмотреть этот список, чтобы получить информацию с каждой веб-страницы автомобиля.

До сих пор я пробовал как метод .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.

0
Pavel Rahman 11 Окт 2021 в 18:38

4 ответа

Лучший ответ

Это потому, что у вас есть список и имя carLinks. Также в вашем цикле:

for carLink in carLinks:
    carLinkUrl = carLink.get_attribute("href")
    carLinks.append(carLinkUrl)

У вас такое же имя веб-элемента.

Компилятор будет думать, что carLinks - это web element из-за локальной области видимости.

А поскольку carLinks равно locally a web element, в Selenium нет метода append.

Пожалуйста, измените одно из имен.

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)
0
cruisepandey 11 Окт 2021 в 15:43

Вы должны добавить ожидание / задержку, чтобы элементы страницы загружались перед доступом к ним.
Без этого получение 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()
1
Prophet 11 Окт 2021 в 15:46

Я заметил, что ваш список carLinks имеет то же имя, что и driver.find. поэтому сначала это имя относится к списку, к которому вы можете добавить. Но прежде чем вы это сделаете, вы измените переменную на веб-элемент (который, я полагаю, является строкой), используя селен.

Может ли это быть проблемой? Я бы предложил переименовать этот список.

Небольшое примечание: проверьте, разрешено ли веб-сканирование на веб-сайте. Я помню, как на сайте autoscout возникли юридические проблемы, связанные с чем-то подобным.

0
Aethryste 11 Окт 2021 в 15:52

Итак, я нашел эту ссылку, где парень использовал range() для цикла вместо повторения списка ссылок (объектов) веб-страницы. Вероятно, есть какая-то проблема местного масштаба, как сказал круизпандей, или, может быть, задержка слишком короткая, как сказал Панди. Теперь все работает нормально.

Я изменил код на это:

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, чтобы сделать ее короче.

0
Tomerikoo 11 Окт 2021 в 17:38