Xpath не выбирает правильный элемент, используя Splinter / Selenium Python 3 - PullRequest
0 голосов
/ 29 ноября 2018

Не уверен, что здесь я совершаю глупую ошибку, я искал повсюду, но не могу понять это.Буду очень признателен за помощь.

Я пытаюсь сделать скребок для очистки данных Google Map Pack.Я использую Splinter для этого.Мне удалось выбрать элемент div для каждого элемента пакета карты, но затем я хочу пройтись по нему и выбрать заголовок (и другие элементы) для каждого из элементов div.

Однако, когда я пытаюсь это сделать, онвсегда выбирает заголовок первого элемента, несмотря на то, что я запускаю find_by_xpath для отдельного элемента.

Вот мой код:

from splinter import Browser
from selenium import webdriver
import time

chrome_options = webdriver.ChromeOptions()
browser = Browser('chrome', options=chrome_options)


browser.visit("https://google.com")

browser.fill('q', 'roofing laredo tx')
# Find and click the 'search' button
time.sleep(5)
button = browser.find_by_name('btnK')
# Interact with elements
button.click()
time.sleep(5)
maps_elements = browser.find_by_xpath("//div[contains(@class,'VkpGBb')]")

for map_element in maps_elements:
    # print(map_element.text)
    title = map_element.find_by_xpath("//div[contains(@class,'dbg0pd')]/span").text
    print(title)

Итак, что я хочу: JJ Flores Roofing & ConstructionHBC Roofing McAllen Valley Roofing Co

но вместо этого я получаю

JJ Flores Кровля и строительство JJ Flores Кровля и строительство JJ Flores Кровля и строительство

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

измените свой код:

maps_elements = browser.find_by_xpath("//div[contains(@class,'VkpGBb')]")

for map_element in maps_elements:
    # print(map_element.text)
    title = maps_elements.find_by_xpath("//div[contains(@class,'dbg0pd')]/span").text
    print(title)

на

title_elements = browser.find_by_xpath("//div[contains(@class,'dbg0pd')]/span")

for title_element in title_elements:
    title = title_element.text
    print(title)
0 голосов
/ 29 ноября 2018

Редактировать:

Вы получили повторный результат, потому что из цикла он выбирает корневой элемент //, он должен быть относительным или ./, чтобы выбрать дочерние элементы, но это все еще не работает и, возможно, ошибка осколка.но попробуйте использовать CSS селектор

for map_element in maps_elements: 
    # select relative but failed
    #title = map_element.find_by_xpath("./div[contains(@class,'dbg0pd')]/span")
    title = map_element.find_by_css("div[class*='dbg0pd'] > span").text
    print(title)

опечатка в переменной, удалите s из

title = maps_elements.....
#title = map_element.....
...