2016-09-14 2 views
0

Я подготавливаю скрипт для веб-слома, который должен найти список адвокатов в области через веб-сайт бизнес-каталога. Я использую драйвер chrome для заполнения ключевых слов и значений области.Как получить доступ к грандиозным дочерним узлам с помощью XPath в Python Selenium?

Поскольку некоторые из хитов не имеют номера телефонов, я хотел бы перебирать список DIV, соответствующих результатам поиска, а затем проверить, имеет ли он номер телефона в качестве великого ребенка, и если да, то я получаю номер телефона, иначе я оставлю это поле пустым.

У меня есть два способа сделать это, как показано ниже.

import time 
import json as js 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

url = 'http://www.yellowpages.com/search?search_terms=Divorce+Attorneys&geo_location_terms=sun+diego' 
RsultsList = [] 

driver = webdriver.Chrome() 
driver.get(url) 
ThereIsNext = True 
while ThereIsNext: 

    # find ads. 
    nAddResults = len(driver.find_elements_by_xpath("//div[@class='result flash-ad']")) 

    #print 'add size = %d' % nAddResults 
    for i in range(nAddResults): 
     phone1 = driver.find_elements_by_xpath("//div[@class='result flash-ad']/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]")[i].text 
     BusinessName1 = driver.find_elements_by_xpath("//div[@class='result flash-ad']//a[@class='business-name']")[i].text 

     elem = driver.find_elements_by_xpath("//div[@class='result flash-ad']") 
     phone2 = elem.find_element_by_xpath("/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]")[i].text 
     BusinessName2 = elem.find_element_by_xpath("//a[@class='business-name']") 

Первый из них подвержен ошибкам в качестве записей без номера телефона. НЕОБХОДИМО показать в конце. Поэтому я придумал второй путь. Тем не менее, я получаю следующее сообщение об ошибке, если попробуйте второе.

Traceback (most recent call last): 
    File "C:\Users\XXXX\documents\visual studio 2015\Projects\PythonApplication3\ 
PythonApplication3\AtorneyList.py", line 23, in <module> 
    phone2 = elem.find_element_by_xpath("/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1 
]").text 
AttributeError: 'list' object has no attribute 'find_element_by_xpath' 
Press any key to continue . . . 

Пожалуйста, дайте мне знать, что мне не хватает. Я проверил this и that уже и не мог понять.

Очень ценю это.

Благодаря

+0

Ваших XPaths выглядят очень хрупкими, не существует никаких классов или идентификаторы, которые вы можете использовать для поиска элементов? –

ответ

1

Собственно find_elements() возвращает либо список WebElement или пустой список. Вы сохраняете этот результат в имени переменной списка elem.

AttributeError: 'list' object has no attribute 'find_element_by_xpath'

Это происходит потому, что вы собираетесь найти вложенную WebElement на elem список, поэтому вы звоните в elem.find_element_by_xpath(), абсолютно неправильно.

На самом деле find_element() или find_elements используется для поиска элемента в контекст страницы или контексте WebElement вместо list.

Таким образом, вы должны попытаться найти список WebElement из driver означает контекст страницы, а затем перебирать найти далее вложенные WebElement, используя этот контекст элемента, как показано ниже: -

elems = driver.find_elements_by_xpath("//div[@class='result flash-ad']") 

for elem in elems: 
    phone2 = elem.find_element_by_xpath(".//div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]").text 
    BusinessName2 = elem.find_element_by_xpath(".//a[@class='business-name']").text 
Смежные вопросы