Я хочу сделать сканер, который начинается с URL-адреса (стр. 1), и следует по ссылке на новую страницу, стр. 2. На стр. 2 он должен следовать ссылке на страницу 3. Затем я хочу очистить некоторые данные на стр. 3.Функция обратного вызова Scrapy, как разобрать несколько страниц?
Тем не менее, я нахожусь на сбое и не могу заставить функцию обратного вызова работать. Вот мой код:
class allabolagnewspider(CrawlSpider):
name="allabolagnewspider"
# allowed_domains = ["byralistan.se"]
start_urls = [
"http://www.allabolag.se/5565794400/befattningar"
]
rules = (
Rule(LinkExtractor(allow = "http://www.allabolag.se",
restrict_xpaths=('//*[@id="printContent"]//a[1]'),
canonicalize=False),
callback='parse_link1'),
)
def parse_link1(self, response):
hxs = HtmlXPathSelector(response)
return Request(hxs.xpath('//*[@id="printContent"]/div[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/a').extract(), callback=self.parse_link2)
def parse_link2(self, response):
for sel in response.xpath('//*[@id="printContent"]'):
item = AllabolagnewItem()
item['Byra'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Namn'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Gender'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Alder'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
yield item
Однако, когда я запускаю его я получаю следующее сообщение об ошибке: «TypeError: URL запроса должен быть Обл или юникода, получил список:»
Если я правильно понял, я беспорядок, когда я пытаюсь вернуть мой запрос для parse_link1. Что мне делать?
Edit:
Вот рабочий код (все еще есть несколько вопросов, но, хотя конкретная проблема была решена):
class allabolagnewspider(CrawlSpider):
name="allabolagnewspider"
# allowed_domains = ["byralistan.se"]
start_urls = [
"http://www.allabolag.se/5565794400/befattningar"
]
rules = (
Rule(LinkExtractor(allow = "http://www.allabolag.se",
restrict_xpaths=('//*[@id="printContent"]//a[2]'),
canonicalize=False),
callback='parse_link1'),
)
def parse_link1(self, response):
for href in response.xpath('''//*[@id="printContent"]/div[2]/table//tr[4]/td/table//tr/td[2]/a/@href''').extract():
print "hey"
yield Request(response.urljoin(href), callback=self.parse_link2)
def parse_link2(self, response):
for sel in response.xpath('//*[@id="printContent"]'):
print "hey2"
item = AllabolagnewItem()
item['Byra'] = sel.xpath('./div[2]/table//tr[3]/td/h1/text()').extract()
item['Namn'] = sel.xpath('./div[2]/table//tr[3]/td/h1/text()').extract()
item['Gender'] = sel.xpath('./div[2]/table//tr[7]/td/table[1]//tr[1]/td/text()').extract()
item['Alder'] = sel.xpath('./div[2]/table//tr[3]/td/h1/text()').extract()
yield item
Спасибо большое. Однако теперь я получаю новую ошибку: «TypeError: Request url должен быть str или unicode, получил NoneType:« – brrrglund
Спасибо за ваш обновленный ответ! Теперь он отлично переполняет связанные страницы. Однако у меня все еще возникла проблема с функцией обратного вызова «callback = self.parse_link2». Он не очищает страницу. Когда я запускаю код, он только сканирует, но не очищает сайт. У меня даже был идентичный вывод, когда я удалил всю функцию parse_link2. Правильно ли выполняю функцию обратного вызова? – brrrglund
@brrrglund, в цикле над результатами вызова '.xpath()', вам нужно использовать ** относительные XPaths ** (начиная с '. /', Чтобы быть в безопасности) вместо абсолютных XPaths (начиная с '/ ') - последние начинаются с корня документа. Попробуйте 'sel.xpath ('./ div [2]/table // tr [3]/td/h1'). Extract()' (я удалил 'tbody /' тоже) –