Я создал объект 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><Selector xpath="//table[@class='rgMasterTable rgClipCells']/tbody/tr" data='<tr class="rgRow" id="dnn_ctr1604_Fin...'></email>
Это версия XML объекта «Селектор» «персона».