2013-07-30 4 views
1

Я пытаюсь очистить ссылки от таблицы, используя разбивку на страницы. Я могу заставить Selenium перебирать страницы, и я могу получить ссылки с первой страницы, однако, если я попытаюсь объединить эти два, когда я доберусь до последней страницы и больше не будет , следующая страница, процесс останавливается, и я ничего не получаю.scrapy pagination selenium python

Я не уверен, как изящно сказать вещи, чтобы просто вернуть данные в csv. Я использую цикл while true:, так что это довольно озадачивает меня.

Другой вопрос связан с таргетингом на ссылки, которые я пытаюсь проанализировать, используя xpath. Ссылки хранятся в двух разных классах tr. Один набор находится под //tr[@class ="resultsY"], а другой под //tr[@class ="resultsW"], есть ли какой-то OR оператор, который я могу использовать для таргетинга всех ссылок за один раз?

Одно решение, которое я нашел: '//tr[@class ="resultsY"] | //tr[@class ="resultsW"]' дает мне ошибку каждый раз.

Вот HTML таблица:

<tr class="resultsW"> 
-<td></td> 
-<td> 
----<a href="fdafda"></a>  <----a link i'm after 
-<td> 
-<td></td> 
</tr> 
<tr class="resultsW"> 
-<td></td> 
-<td> 
----<a href="fdafda"></a>  <----a link i'm after 
-<td> 
-<td></td> 
</tr> 

А вот мой SCRAPY:

import time 
from scrapy.item import Item, Field 
from selenium import webdriver 
from scrapy.spider import BaseSpider 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
from scrapy.selector import HtmlXPathSelector 

class ElyseAvenueItem(Item): 
    link = Field() 
    link2 = Field() 

class ElyseAvenueSpider(BaseSpider): 
    name = "s1" 
    allowed_domains = ["nces.ed.gov"] 
    start_urls = [ 
    'https://nces.ed.gov/collegenavigator/'] 

    def __init__(self): 
     self.driver = webdriver.Firefox() 

    def parse(self, response): 
     self.driver.get(response.url) 
     select = Select(self.driver.find_element_by_id("ctl00_cphCollegeNavBody_ucSearchMain_ucMapMain_lstState")) 
     select.deselect_by_visible_text("No Preference") 
     select.select_by_visible_text("Alabama") 
     self.driver.find_element_by_id("ctl00_cphCollegeNavBody_ucSearchMain_btnSearch").click() 

#here is the while loop. it gets to the end of the table and says...no more "next page" and gives me the middle finger 

     '''while True: 
      el1 = self.driver.find_element_by_partial_link_text("Next Page") 
      if el1: 
       el1.click() 
      else: 
       #return(items) 
       self.driver.close()''' 
     hxs = HtmlXPathSelector(response) 

     ''' 
#here i tried: titles = self.driver.find_elements_by_xpath('//tr[@class ="resultsW"] | //tr[@class ="resultsY"]') and i got an error saying that 

     titles = self.driver.find_elements_by_xpath('//tr[@class ="resultsW"]') 
     items = [] 
     for titles in titles: 
      item = ElyseAvenueItem() 

#here i'd like to be able to target all of the hrefs...not sure how 

      link = titles.find_element_by_xpath('//tr[@class ="resultsW"]/td[2]/a') 
      item ["link"] = link.get_attribute('href') 
      items.append(item) 
     yield(items) 

ответ

1

Преодолевая этот пост в три должности увеличит ваши шансы на получение хороших ответов.

Для первого вопроса было бы полезно узнать более точно, что означает «процесс останавливается, и я ничего не понимаю». Я не вижу, чтобы вы пытались написать «ссылки» в файл. Я не понимаю, почему вы делаете то, что делаете в своем предложении else.

Для второго вопроса использование регулярного выражения может сделать трюк. См. this.

Для третьего вопроса, так как элемент title список

titles = self.driver.find_elements_by_xpath('//tr[@class ="resultsW"]'),

вы могли бы просто сделать

hrefs=[] 
for titles in titles: 
    href = titles.find_element_by_xpath('a').get_attribute('href') 
    hrefs.append(href) 

Как и в сторону, если все, что вы пытаетесь сделать, это получить ссылки со страницы, рассмотрите mechanize, lxml.html и | или BeautifulSoup.

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