Парсинг LXML

Maxim_Py

Новичок
Пользователь
Июл 13, 2020
11
0
1
Добрый день,
Пытаюсь спарсить адреса АЗС. Пишу следующее:
Python:
[CODE]links_pskov = ['https://pskovnp.ru/map/']

regions = []


addresses = []


for link in links_pskov:

    main_page = link


    page = requests.get(main_page).content

    html_tree = html.fromstring(page, parser=html.HTMLParser())


    for address in html_tree.xpath("//div[@class = 'map-table--locations']//span//text()"):

        addresses += [address.text]

        regions += ['Псковская область']
[/CODE]
Где ошибка
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Скорее всего данные на сайте подгружаются с помощью ajax`а и при запросе страницы через requests их не видно. Для того чтобы их спарсить можно использовать selenium. Вот пример:
Python:
from selenium import webdriver

# если драйвер для хрома не добавлен в PATH, то нужно указать к нему путь
# например driver = webdriver.Chrome('D://driver//chromedriver.exe')
driver = webdriver.Chrome()
driver.get("https://pskovnp.ru/map/")
driver.implicitly_wait(3)
elements = driver.find_elements_by_class_name("map-table--locations")

addreses = []
for el in elements:
    adress = el.find_element_by_tag_name('span').get_attribute('innerHTML')
    addreses.append(adress)


driver.close()
driver.quit()

# выведет список адресов в консоль
for adress in addreses:
    print(adress)
 
  • Мне нравится
Реакции: Maxim_Py и root

Asgardov

Пользователь
Пользователь
Май 23, 2020
38
10
8
В адресе страницы.
 

Maxim_Py

Новичок
Пользователь
Июл 13, 2020
11
0
1
В адресе страницы.
Случайно скопировал не правильно:) Не работает даже с нужным адресом
 

Maxim_Py

Новичок
Пользователь
Июл 13, 2020
11
0
1
Да, сработало, спасибо!
А почему тут не срабатывает??

Python:
for link in ['http://ltk-48.ru/map/#114']:
    driver = webdriver.Chrome()
    driver.get(link)
    driver.implicitly_wait(5)
    elements = driver.find_elements_by_class_name("address with_price")
    for el in elements:
        adress = el.get_attribute('innerText')[1]
        addresses.append(adress)
        regions += ['Псковская область']

    driver.close()
    driver.quit()
Даже
Python:
elements
пустые :(
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Да, сработало, спасибо!
А почему тут не срабатывает??

Python:
for link in ['http://ltk-48.ru/map/#114']:
    driver = webdriver.Chrome()
    driver.get(link)
    driver.implicitly_wait(5)
    elements = driver.find_elements_by_class_name("address with_price")
    for el in elements:
        adress = el.get_attribute('innerText')[1]
        addresses.append(adress)
        regions += ['Псковская область']

    driver.close()
    driver.quit()
Даже
Python:
elements
пустые :(
Вот пример для этой ссылки:
Python:
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://ltk-48.ru/map/#114')
driver.implicitly_wait(3)

elements = driver.find_elements_by_class_name("with_price")
for el in elements:
    print(el.get_attribute('innerText'))


driver.close()
driver.quit()
 

Asgardov

Пользователь
Пользователь
Май 23, 2020
38
10
8
Да, сработало, спасибо!
А почему тут не срабатывает??

Python:
for link in ['http://ltk-48.ru/map/#114']:
    driver = webdriver.Chrome()
    driver.get(link)
    driver.implicitly_wait(5)
    elements = driver.find_elements_by_class_name("address with_price")
    for el in elements:
        adress = el.get_attribute('innerText')[1]
        addresses.append(adress)
        regions += ['Псковская область']

    driver.close()
    driver.quit()
Даже
Python:
elements
пустые :(

Потому как локатор для поиска выбран не верно.
Проверить себя можно в консоли набрав
$$(".*имя_класса*") - в вашем случае $$(".address with_price ")
Если используете xpath
$x("*локатор xpath*") - в вашем случае это $x("//div[@class=\"address with_price\"]")

Проверяйте локаторы прямо в браузере.
 

Maxim_Py

Новичок
Пользователь
Июл 13, 2020
11
0
1
Python:
driver = webdriver.Chrome()
driver.get('http://www.faeton.spb.ru/map/')
driver.implicitly_wait(40)
elements = driver.find_elements_by_class_name("address")
for el in elements:
    addresses.append(el.getAttribute("innerText"))

driver.close()
driver.quit()

Прошу прощения, за такое количество однотипных вопросов, но что не так здесь?
Локатор в консоли проверил...
 

Вложения

  • фаэтон.PNG
    фаэтон.PNG
    8,7 КБ · Просмотры: 0

Asgardov

Пользователь
Пользователь
Май 23, 2020
38
10
8
Python:
driver = webdriver.Chrome()
driver.get('http://www.faeton.spb.ru/map/')
driver.implicitly_wait(40)
elements = driver.find_elements_by_class_name("address")
for el in elements:
    addresses.append(el.getAttribute("innerText"))

driver.close()
driver.quit()

Прошу прощения, за такое количество однотипных вопросов, но что не так здесь?
Локатор в консоли проверил...

Предположу что подобное может быть из-за наличия фрейма в коде страницы. То есть то что вы ищете находится внутри фрейма

1595322394871.png

Для хромдрайвера это две разные страницы.

То есть сначала надо переключиться на фрейм и внутри фрейма уже искать адреса. (Осторожно, там фреймов много)
 
  • Мне нравится
Реакции: Maxim_Py

Maxim_Py

Новичок
Пользователь
Июл 13, 2020
11
0
1
Спасибо!
 

Форум IT Специалистов