2017-02-12 1 views
2

Я пытаюсь получить список адресов электронной почты с веб-сайта и очень близко. Код, который у меня есть, можно посмотреть ниже. Я получаю следующую ошибку.python - Найти адрес электронной почты на странице с selenium

Что происходит, так это то, что есть страница ссылок, которые затем нажаты, и на следующей странице есть адрес электронной почты.

Я пытаюсь распечатать адрес электронной почты на каждой странице после щелчка ссылки.

Here is an example of a page that the link clicks through to.

xTraceback (самый последний вызов последнего): Файл "scrape.py", строка 34, в поиска (драйвер) Файл "scrape.py", строка 26, в поиска emailAdress = driver.find_element_by_xpath ('// div [@ id = "widget-contact"] // a') .get_attribute ('hr ef') Файл "/usr/local/lib/python2.7/site-packages/selenium/ webdriver/remote/webdriver.py ", строка 293, в find_element_by_xpath return self.find_element (by = By.XPATH, value = xpath) Файл" /usr/local/lib/python2.7/site-packages/selenium/ webdriver/remote/webdriver.py ", строка 752, в find_element 'значение': значение}) ['value'] Файл «/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py», строка 236, в исполнении self.error_handler.check_response (response) Файл " /usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py ", строка 192, в check_response raise exception_class (message, screen, stacktrace) selenium.common.exceptions.InvalidSelectorException:

Я использую python 2.7.13.

# -*- coding: utf-8 -*- 

from lxml import html 
import requests 
import time 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

def init_driver(): 
    driver = webdriver.Firefox() 
    driver.wait = WebDriverWait(driver, 5) 
    return driver 


def lookup(driver): 
    driver.get("http://www.sportbirmingham.org/directory?sport=&radius=15&postcode=B16+8QG&submit=Search") 
    try: 
     for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a'): 
      link.click() 
      emailAdress = driver.find_element_by_xpath('//div[@id="widget-contact"]//a‌​').get_attribute('hr‌​ef') 
      print emailAdress 
    except TimeoutException: 
     print "not found" 


if __name__ == "__main__": 
    driver = init_driver() 
    lookup(driver) 
    time.sleep(5) 
    driver.quit() 

Когда я пытаюсь перейти к следующей странице ссылки я получаю следующую ошибку

Файл «scrape.py», строка 43, в поиска (драйвер) Файл «scrape.py ", строка 26, в поиске links.extend ([link.get_attribute ('href') для ссылки в файле driver.find_elements_by_xpath ('// h2 [@ class =" heading "]/a')]) Файл "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py ", строка 139, в get_attribute self, name) Файл" /usr/local/lib/python2.7/site -packages/себе lenium/webdriver/remote/webdriver.py ", строка 465, в файле execute_script 'args': convert_args}) ['value'] Файл" /usr/local/lib/python2.7/site-packages/selenium/webdriver /remote/webdriver.py ", строка 236, в исполнении self.error_handler.check_response (response) Файл" /usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py " , строка 192, in check_response raise exception_class (message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: Ссылка на элемент устарела. Либо элемент больше не , прикрепленный к DOM, либо страница была обновлена.

+0

Не могли бы вы опубликовать некоторые HTML, поэтому мы можем проверить, если селектор является правильным? – Usmiech

+0

Общий общий журнал об ошибках – Andersson

+0

@ Andersson полный журнал общий –

ответ

0

Это похоже на проблему с копией/вставкой. Иногда, когда вы копируете код из ответов StackOverflow, могут присутствовать некоторые скрытые символы. Ваш XPath в Python shell выглядит как '//div[@id="widget-contact"]//a‌​??'. Вы должны переписать его вручную, чтобы избавиться от них. ?? ...

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

Попробуйте использовать ниже код вместо:

from selenium.common.exceptions import NoSuchElementException 

def lookup(driver): 
    driver.get("http://www.sportbirmingham.org/directory?sport=&radius=15&postcode=B16+8QG&submit=Search") 
    links = [link.get_attribute('href') for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a')] 
    page_counter = 1 
    while True: 
     try: 
      page_counter += 1 
      driver.find_element_by_link_text(str(page_counter)).click() 
      links.extend([link.get_attribute('href') for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a')]) 
     except NoSuchElementException: 
      break    
    try: 
     for link in links: 
      driver.get(link) 
      try: 
       emailAdress = driver.find_element_by_xpath('//div[@id="widget-contact"]//a').text 
       print emailAdress 
      except NoSuchElementException: 
       print "No email specified" 
    except TimeoutException: 
     print "not found" 
+0

, он получает первый, но затем падает, когда попадает на следующую страницу .. это сообщение об ошибке '' 'raise exception_class (message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Сообщение: Не удалось найти элемент: // div [@ id = "widget-contact"] // a''' –

+0

, потому что вы пытаетесь найти другой контакт на той же странице. Вы должны выполнить driver.navigate(). Back() – torina

+0

Это потому, что на некоторых страницах нет электронных писем. код обновлен – Andersson

3

Вам просто нужно более точно X-PATH (так же с вызовом тексту метод):

emailAdress = driver.find_element_by_xpath('//div[@class="body"]/dl/dd[2]').text 

Но этот пример работает с Python3. Дайте мне знать, если это сработает для вас. Я бы также рекомендовал использовать расширение XPath Helper для Chrome.

+0

do u знаете, как это сделать с помощью python 2? –

+0

должен работать как для – torina

Смежные вопросы