Доступ к атрибутам / данным объекта Selenium "Selector", Python / Scrapy - PullRequest
0 голосов
/ 13 октября 2019

Я создал объект Selector для хранения элемента, выбранного driver.page_source. У меня были проблемы с итерацией и доступом к данным напрямую, поэтому я создал объект «Селектор», чтобы цикл мог повторяться. Если этого можно избежать, пожалуйста, дайте мне знать.

Проблема в том, что мне нужен доступ к некоторым данным внутри этого объекта Selector, в частности к атрибуту id элемента. Всякий раз, когда я пытаюсь использовать функцию на объекте, такую ​​как get_attribute, он заявляет: Объект «селектор» не имеет атрибута «данные»

Я пытался использовать различные методы доступа, такие какв качестве подпрограммы значение непосредственно "['id']". Это не применимо.

Кто-нибудь знает, как получить доступ к этим данным или, возможно, переработать мой код, чтобы сделать его доступным?

    class emails_spider(scrapy.Spider):
    name= 'emails'
    allowed_domains = ["example.com"]
    start_urls = [ 'example', ]

    def __init__(self):
        #setup driver and browser emulation
        self.driver = webdriver.Firefox()

    # start firefox emulator 
    def parse(self, response):
        self.driver.get(response.url)
        search = True #search condition boolean
        iteration = 0 #while loop iteration counter

        #while there is a next page to click on
        while True:
            # try get next page content
            # yield { 'person': self.driver.page_source }
            sel = scrapy.Selector(text=self.driver.page_source) #create Selector object for easy access in for loop
            # iterate each tr element in path
            for person in sel.xpath("//table[@class='rgMasterTable rgClipCells']/tbody/tr"): 

                # instansiate email_spiderPerson object and set all values from person 
                item = email_spiderPerson()
                item['name'] = person.xpath("td[1]/text()").extract()
                item['city'] = person.xpath("td[2]/text()").extract()
                item['state'] = person.xpath("td[3]/text()").extract()
                item['country'] = person.xpath("td[4]/text()").extract()
                item['phone'] = person.xpath("td[5]/text()").extract()
                item['website'] = person.xpath("td[6]/text()").extract()
                item['cred'] = person.xpath("td[7]/text()").extract()

                # code chunk below - click on current tr element to go to page and retrieve email, then return and continue loop
                # This below part is a problem, must not grab manual index ([1]), Must be auto, Use person object? 
                email_path = self.driver.find_element_by_xpath("//table[@class='rgMasterTable rgClipCells']/tbody/tr[1]")
                #WebDriverWait(self.driver, 1000)
                self.driver.execute_script("arguments[0].setAttribute('class','rgRow rgHoveredRow')", email_path)
                div_click = self.driver.find_element_by_xpath("//div[@class='RadGrid RadGrid_MXDefault']")
                #self.driver.execute_script("arguments[0].scrollIntoView();", email_path2)
                div_click.click()

                email = scrapy.Selector(text=self.driver.page_source)
                email_value = email.xpath("//div[@class='GlobalFindAccountTemplate_MXDefault']/a").extract()
                item['email'] = person.data('id')
                self.driver.execute_script("window.history.go(-1)")

                yield item

            # if first time then click search / else click next button
            if search == True:
                next_url = self.driver.find_element_by_xpath("//fieldset[@class='buttons']/input[@value='Search']")
                search = False
            else:
                next_url = self.driver.find_element_by_xpath("//ul[@class='pagination']/li[@class='next']/a")
            try:
                next_url.click()
                iteration = iteration + 1
            except:
                break
            if iteration >= 3:
                break
        self.driver.close()  

Также вы можете заметить, что я установил значение моего элемента ['email'] равным person.data ('id'). Я просто хотел попытаться получить удостоверение личности. Если задано значение «персона», в формате XML выводится следующее:

<email>&lt;Selector xpath="//table[@class='rgMasterTable rgClipCells']/tbody/tr" data='&lt;tr class="rgRow" id="dnn_ctr1604_Fin...'&gt;</email>

Это версия XML объекта «Селектор» «персона».

1 Ответ

0 голосов
/ 13 октября 2019

Если вам нужен атрибут id селектора person:

item['email'] = person.xpath('./@id').extract_first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...