Scrapy SgmlLinkExtractor ignore les liens autorisés
-
06-07-2019 - |
Question
Veuillez consulter cet exemple d'araignée dans la documentation Scrapy. L'explication est la suivante:
Cette araignée commencerait à explorer la page d’accueil d’exemple.com, en collectant des liens de catégorie et des liens d’article, en analysant cette dernière avec la méthode parse_item. Pour chaque réponse d'élément, certaines données seront extraites du code HTML à l'aide de XPath et un élément en sera rempli.
J'ai copié exactement la même araignée et remplacé "& example; exemple.com". avec une autre URL initiale.
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from stb.items import StbItem
class StbSpider(CrawlSpider):
domain_name = "stb"
start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm']
rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm', )), callback='parse', follow=True), )
def parse(self, response):
hxs = HtmlXPathSelector(response)
item = StbItem()
item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.')
return item
SPIDER = StbSpider()
Mais mon araignée " stb " ne collecte pas les liens de " / bios / " comme il est supposé faire. Il exécute l'URL initiale, extrait l'élément ['JD']
, l'écrit dans un fichier, puis se ferme.
Pourquoi SgmlLinkExtractor
est-il ignoré? La Rule
est lue car elle intercepte les erreurs de syntaxe à l'intérieur de la ligne Rule
.
Est-ce un bug? y a-t-il quelque chose qui cloche dans mon code? Il n'y a pas d'erreur sauf une série d'erreurs non gérées que je vois à chaque exécution.
Ce serait bien de savoir ce que je fais mal ici. Merci pour tous les indices. Est-ce que je comprends mal ce que SgmlLinkExtractor
est censé faire?
La solution
La fonction parse
est en réalité implémentée et utilisée dans la classe CrawlSpider et vous la redéfinissez involontairement. Si vous changez le nom, par exemple, parse_item
, la règle devrait fonctionner.