urljoin scraping example espaƱol docs python web-crawler scrapy

python - scraping - scrapy vs beautifulsoup



Scrapy-Seguir enlaces RSS (4)

Ejemplo XML de scrapy doc XMLFeedSpider

from scrapy.spiders import XMLFeedSpider from myproject.items import TestItem class MySpider(XMLFeedSpider): name = ''example.com'' allowed_domains = [''example.com''] start_urls = [''http://www.example.com/feed.xml''] iterator = ''iternodes'' # This is actually unnecessary, since it''s the default value itertag = ''item'' def parse_node(self, response, node): self.logger.info(''Hi, this is a <%s> node!: %s'', self.itertag, ''''.join(node.extract())) #item = TestItem() item = {} # change to dict for removing the class not found error item[''id''] = node.xpath(''@id'').extract() item[''name''] = node.xpath(''name'').extract() item[''description''] = node.xpath(''description'').extract() return item

Me preguntaba si alguien alguna vez intentó extraer / seguir enlaces de elementos RSS usando SgmlLinkExtractor / CrawlSpider. No puedo conseguir que funcione...

Estoy usando la siguiente regla:

rules = ( Rule(SgmlLinkExtractor(tags=(''link'',), attrs=False), follow=True, callback=''parse_article''), )

(teniendo en cuenta que los enlaces rss están ubicados en la etiqueta de enlace ).

No estoy seguro de cómo decirle a SgmlLinkExtractor que extraiga el texto () del enlace y que no busque los atributos ...

Cualquier ayuda es bienvenida, Gracias de antemano



Las reglas de CrawlSpider no funcionan de esa manera. Probablemente necesites subclasificar BaseSpider e implementar tu propia extracción de enlace en tu devolución de llamada spider. Por ejemplo:

from scrapy.spider import BaseSpider from scrapy.http import Request from scrapy.selector import XmlXPathSelector class MySpider(BaseSpider): name = ''myspider'' def parse(self, response): xxs = XmlXPathSelector(response) links = xxs.select("//link/text()").extract() return [Request(x, callback=self.parse_link) for x in links]

También puede probar el XPath en el shell ejecutando, por ejemplo:

scrapy shell http://blog.scrapy.org/rss.xml

Y luego escribiendo en el shell:

>>> xxs.select("//link/text()").extract() [u''http://blog.scrapy.org'', u''http://blog.scrapy.org/new-bugfix-release-0101'', u''http://blog.scrapy.org/new-scrapy-blog-and-scrapy-010-release'']


Lo he hecho usando CrawlSpider:

class MySpider(CrawlSpider): domain_name = "xml.example.com" def parse(self, response): xxs = XmlXPathSelector(response) items = xxs.select(''//channel/item'') for i in items: urli = i.select(''link/text()'').extract() request = Request(url=urli[0], callback=self.parse1) yield request def parse1(self, response): hxs = HtmlXPathSelector(response) # ... yield(MyItem())

pero no estoy seguro de que sea una solución muy adecuada ...