سؤال

وهذا هو رمز للSpyder1 التي كنت تحاول الكتابة ضمن إطار Scrapy:

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 firm.items import FirmItem

class Spider1(CrawlSpider):
    domain_name = 'wc2'
    start_urls = ['http://www.whitecase.com/Attorneys/List.aspx?LastName=A']
    rules = (
        Rule(SgmlLinkExtractor(allow=["hxs.select(
            '//td[@class='altRow'][1]/a/@href').re('/.a\w+')"]), 
            callback='parse'),
    )

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        JD = FirmItem()
        JD['school'] = hxs.select(
                   '//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)'
        )
        return JD    

SPIDER = Spider1()

والتعبير المعتاد في rules تسحب بنجاح جميع عناوين المواقع الحيوية التي أريد من رابط البداية:

>>> hxs.select(
...             '//td[@class="altRow"][1]/a/@href').re('/.a\w+')
[u'/cabel', u'/jacevedo', u'/jacuna', u'/aadler', u'/zahmedani', u'/tairisto', u
'/zalbert', u'/salberts', u'/aaleksandrova', u'/malhadeff', u'/nalivojvodic', u'
/kallchurch', u'/jalleyne', u'/lalonzo', u'/malthoff', u'/valvarez', u'/camon',
u'/randerson', u'/eandreeva', u'/pangeli', u'/jangland', u'/mantczak', u'/darany
i', u'/carhold', u'/marora', u'/garrington', u'/jartzinger', u'/sasayama', u'/ma
sschenfeldt', u'/dattanasio', u'/watterbury', u'/jaudrlicka', u'/caverch', u'/fa
yanruoh', u'/razar']
>>>

ولكن عند تشغيل رمز أحصل

[wc2] ERROR: Error processing FirmItem(school=[]) - 

[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range

وهذا هو FirmItem في Items.py

from scrapy.item import Item, Field

class FirmItem(Item):
    school = Field()

    pass

هل يمكنك مساعدتي فهم حيث يحدث الخطأ مؤشر؟

ويبدو لي أن لديها ما تفعله مع SgmLinkExtractor .

ولقد تم في محاولة لجعل هذا العمل العنكبوت لأسابيع مع Scrapy. لديهم تعليمي ممتاز ولكن أنا جديدة على الثعبان وبرمجة الويب لذلك أنا لا أفهم كيف يمكن على سبيل المثال SgmlLinkExtractor يعمل خلف الكواليس.

وسيكون من الأسهل بالنسبة لي لمحاولة لكتابة العنكبوت مع نفس الوظائف بسيطة مع مكتبات بايثون؟ وسأكون ممتنا بأي تعليقات والمساعدة.

والشكر

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

المحلول

وSgmlLinkExtractor لا يدعم محددات في تقريرها حجة "السماح".

وهكذا وهذا خطأ:

SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])

وهذا هو الصحيح:

SgmlLinkExtractor(allow=[r"product\.php"])

نصائح أخرى

ويتم استدعاء الدالة تحليل لكل مباراة من SgmlLinkExtractor الخاص بك.

وكما ذكر بابلو تريد تبسيط SgmlLinkExtractor الخاص بك.

وكما أنني حاولت أن تضع كشط الأسماء من رابط الأولي في القائمة ثم تمرير كل اسم تحليل في شكل رابط المطلق كما http://www.whitecase.com/aabbas (ل/ aabbas).

والتعليمة البرمجية التالية حلقات عبر قائمة، ولكن أنا لا أعرف كيف لتمرير هذا تحليل. هل تعتقد أن هذا هو فكرة أفضل؟

baseurl = 'http://www.whitecase.com'
names = ['aabbas', '/cabel', '/jacevedo', '/jacuna', '/igbadegesin']

def makeurl(baseurl, names):
  for x in names:
      url = baseurl + x
      baseurl = 'http://www.whitecase.com'
      x = ''
      return url
scroll top