سؤال

يرجى إلقاء نظرة على هذا المثال العنكبوت في وثائق Scrapy. وتفسير ذلك:

<اقتباس فقرة>   

وهذا العنكبوت سيبدأ الزحف الصفحة الرئيسية example.com، وجمع الروابط الفئة، وصلات البند، تحليل هذا الأخير مع أسلوب parse_item. لكل استجابة البند، سيتم استخراج بعض البيانات من HTML باستخدام كسباث، والبند سوف يتم ملأ معها.

وأنا نسخ نفس العنكبوت بالضبط، واستبدال "example.com" مع رابط الأولي أخرى.

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()

ولكن بلدي العنكبوت "STB" لا تجمع الروابط من "/ السير /" كما يفترض أن تفعله. يعمل على رابط الأولي، الورطات وitem['JD'] ويكتب على ملف ومن ثم إنهاء.

لماذا يتم ذلك SgmlLinkExtractor يتم تجاهل؟ تتم قراءة Rule؛ لأنه يدرك أخطاء في بناء الجملة داخل الخط Rule.

وهذا هو الخلل؟ هناك شيء خاطئ في قانون بلدي؟ لا توجد أية أخطاء باستثناء حفنة أخطاء غير معالج أن أرى مع كل تشغيل.

وسيكون من الجميل أن نعرف ما أقوم به خطأ هنا. شكرا لأي أدلة. أنا سوء الفهم ما يفترض SgmlLinkExtractor أن تفعل؟

هل كانت مفيدة؟

المحلول

ويتم تنفيذ وظيفة parse فعلا وتستخدم في فئة CrawlSpider، وكنت تجاوز ذلك عن غير قصد. إذا قمت بتغيير الاسم إلى شيء آخر، مثل parse_item، ثم حكم يجب أن تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top