python - example - scrapy vs beautifulsoup
Cómo usar la clase Rule en scrapy (1)
Puede estar seguro ya que este es el comportamiento predeterminado de los extractores de enlaces en Scrapy ( código fuente ).
Además, el argumento restrict_xpaths
no debe apuntar al atributo @href
, sino que debe apuntar a a
elemento o contenedor que tenga a
elemento como descendiente. Además, restrict_xpaths
se puede definir como una cadena.
En otras palabras, reemplace:
restrict_xpaths=(''//li[@class="next"]/a/@href'',)
con:
restrict_xpaths=''//li[@class="next"]/a''
Además, debe cambiar a LxmlLinkExtractor
desde SgmlLinkExtractor
:
Los extractores de enlaces basados en SGMLParser no se mantienen y se desaconseja su uso. Se recomienda migrar a LxmlLinkExtractor si todavía está utilizando SgmlLinkExtractor.
Personalmente, suelo usar el atajo LxmlLinkExtractor
para LxmlLinkExtractor
:
from scrapy.contrib.linkextractors import LinkExtractor
Para resumir, esto es lo que tendría en las rules
:
rules = [
Rule(LinkExtractor(restrict_xpaths=''//li[@class="next"]/a''), follow=True)
]
Estoy tratando de usar la clase Rule para ir a la siguiente página de mi rastreador. Aquí está mi código
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from crawler.items import GDReview
class GdSpider(CrawlSpider):
name = "gd"
allowed_domains = ["glassdoor.com"]
start_urls = [
"http://www.glassdoor.com/Reviews/Johnson-and-Johnson-Reviews-E364_P1.htm"
]
rules = (
# Extract next links and parse them with the spider''s method parse_item
Rule(SgmlLinkExtractor(restrict_xpaths=(''//li[@class="next"]/a/@href'',)), follow= True)
)
def parse(self, response):
company_name = response.xpath(''//*[@id="EIHdrModule"]/div[3]/div[2]/p/text()'').extract()
''''''loop over every review in this page''''''
for sel in response.xpath(''//*[@id="EmployerReviews"]/ol/li''):
review = Item()
review[''company_name''] = company_name
review[''id''] = str(sel.xpath(''@id'').extract()[0]).split(''_'')[1] #sel.xpath(''@id/text()'').extract()
review[''body''] = sel.xpath(''div/div[3]/div/div[2]/p/text()'').extract()
review[''date''] = sel.xpath(''div/div[1]/div/time/text()'').extract()
review[''summary''] = sel.xpath(''div/div[2]/div/div[2]/h2/tt/a/span/text()'').extract()
yield review
Mi pregunta es sobre la sección de reglas. En esta regla, el enlace extraído no contiene el nombre de dominio. Por ejemplo, devolverá algo como "/Reviews/Johnson-and-Johnson-Reviews-E364_P1.htm"
¿Cómo puedo asegurarme de que mi rastreador anexará el dominio al enlace devuelto?
Gracias