Имитация нажатия ссылки внутри ссылки — Selenium Python

Знание Python: начинающий

Мне удалось создать скрипт для очистки контактной информации. Поток я следовал, так как я новичок, чтобы извлечь все первые ссылки и скопировал его в текстовый файл, и это используется в link = browser.find_element_by_link_text(str (link_text)) выскабливание контактных данных было подтверждено работой (на основе моего отдельного прогона). Проблема в том, что после нажатия на первые ссылки, он не будет продолжать щелкать ссылки внутри него, следовательно, он не может выскоблить контактную информацию.

Что не так с моим сценарием? Пожалуйста, имейте в виду, что я новичок, поэтому мой сценарий немного ручной и длительный.
Большое спасибо!!!

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 NoSuchElementException

import requests
from bs4 import BeautifulSoup
import urllib
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import csv, time, lxml

######################### open file list ####################################
testfile = open("category.txt") # this is where I saved the category
readfile = testfile.read()
readfilesplit = readfile.split("n")
############################### end ###################################

################### open browser ###############################
browser = webdriver.Firefox()
browser.get('http://aucklandtradesmen.co.nz/')
####################### end ###################################

link_texts = readfilesplit
for link_text in link_texts:

        link = browser.find_element_by_link_text(str(link_text))
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".add-listing")))

        link.click() #click link
        time.sleep(5)

        print "-------------------------------------------------------------------------------------------------"
        print("Getting listings for '%s'" % link_text)

################# get list name #######################
        urlNoList = 'http://aucklandtradesmen.co.nz/home-mainmenu-1.html'
        r = requests.get(browser.current_url)

        if (urlNoList != browser.current_url):
            soup = BeautifulSoup(r.content, 'html.parser')

            g_data = soup.find_all("div", {"class":"listing-summary"})
            pageRange = soup.find_all("span", {"class":"xlistings"})

            pageR = [pageRange[0].text]
            pageMax = str(pageR)[-4:-2] # get max item for lists

            X = str(pageMax).replace('nd', '0')
            # print "Number of listings: ", X
            Y  = int(X) #convert string to int
            print "Number of listings: ", Y

            for item in g_data:
                try:
                    listingNames = item.contents[1].text
                    lstList = []
                    lstList[len(lstList):] = [listingNames]

                    replStr = re.sub(r"u'",  "'",str(lstList)) #strip u' char

                    replStr1 = re.sub(r"s+'",  "'",str(replStr)) #strip space and '

                    replStr2 = re.sub(r"sFeatured",  "",str(replStr1)) #strip Featured string
                    print "Cleaned string: ", replStr2

                    ################ SCRAPE INFO ################
################### This is where the code is not executing #######################
                    count = 0
                    while (count < Y):
                        for info in replStr2:
                            link2 = browser.find_element_by_link_text(str(info))
                            time.sleep(10)
                            link2.click()
                            WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#rating-msg")))
                            print "count", count
                            count+= 1
                            print("Contact info for: '%s'" % link_text)

                            r2 = requests.get(browser.current_url)

                            soup2 = BeautifulSoup(r2.content, 'html.parser')

                            g_data2 = soup.find_all("div", {"class":"fields"})

                            for item2 in g_data2:
                            # print item.contents[0]
                                print item2.contents[0].text
                                print item2.contents[1].text
                                print item2.contents[2].text
                                print item2.contents[3].text
                                print item2.contents[4].text
                                print item2.contents[5].text
                                print item2.contents[6].text
                                print item2.contents[7].text
                                print item2.contents[8].text

                    browser.back()
                    WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".add-listing")))
################### END ---- This is where the code is not executing END ---#######################
                    ############ END SCRAPE INFO ####################
                except NoSuchElementException:
                    browser.back()
                    WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav")))

        else:
            browser.back()
            WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav")))
            print "Number of listings: 0"

        browser.back()
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav")))

Кстати это часть результата:

-------------------------------------------------------------------------------------------------
Getting listings for 'Plumbers'
Number of listings:  5
Cleaned string:  ['Hydroflame Plumbing & Gas Ltd']
Cleaned string:  ['Osborne Plumbing Ltd']
Cleaned string:  ['Plumbers Auckland Central']
Cleaned string:  ['Griffiths Plumbing']
Cleaned string:  ['Plumber Auckland']
-------------------------------------------------------------------------------------------------
Getting listings for 'Professional Services'
Number of listings:  2
Cleaned string:  ['North Shore Chiropractor']
Cleaned string:  ['Psychotherapy Werks - Rob Hunter']
-------------------------------------------------------------------------------------------------
Getting listings for 'Property Maintenance'
Number of listings:  7
Cleaned string:  ['Auckland Tree Services']
Cleaned string:  ['Bob the Tree Man']
Cleaned string:  ['Flawless House Washing & Drain Unblocking']
Cleaned string:  ['Yardiez']
Cleaned string:  ['Build Corp Apartments Albany']
Cleaned string:  ['Auckland Trellis']
Cleaned string:  ['Landscape Design']

2 ответа

  1. Что бы я сделал, так это немного изменил логику. Вот логический поток, который я бы предложил вам использовать. Это позволит исключить списание ссылок и ускорить работу скрипта.

    1. Navigate to http://aucklandtradesmen.co.nz/
    2. Grab all elements using CSS selector "#index a" and store the attribute "href" of each
       in an array of string (links to each category page)
    3. Loop through the href array
       3.1. Navigate to href
            3.1.1. Grab all elements using CSS selector "div.listing-summary a" and store the
                   .text of each (company names)
            3.1.2. If an element .by_link_text("Next") exists, click it and return to 3.1.1.
    

    Если вы хотите удалить информацию о деловых контактах со страниц компании, то вы хотите сохранить href в 3.1.1. а затем пройдите через этот список и возьмите то, что вы хотите со страницы.


    Извините за странность форматирования списка. Это не позволит мне отступить больше, чем на один уровень.

  2. хорошо, я нашел решение, подумав о предложении @jeffC:

    • извлеките значения href и добавьте его к базовому url, который http://aucklandtradesmen.co.nz , так например если извлеченный href / главная-mainmenu-1 / alarms-a-security / armed-alarms-ltd -.html, и скажите браузеру, чтобы перейти к этому URL..и тогда я смогу делать все, что захочу на текущей странице..