Я пытаюсь очистить ссылки от таблицы, используя разбивку на страницы. Я могу заставить 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)