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
Hay un XMLFeedSpider
se puede usar hoy en día.
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 ...