문제

이것은 스크레이프 프레임 워크 내에서 작성하려는 Spyder1의 코드입니다.

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

regex rules 시작 URL에서 원하는 모든 바이오 URL을 성공적으로 가져옵니다.

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

이것은 Items.py의 Firmitem입니다

from scrapy.item import Item, Field

class FirmItem(Item):
    school = Field()

    pass

인덱스 오류가 어디에서 발생하는지 이해하도록 도와 줄 수 있습니까?

그것은 나에게 관련이있는 것 같습니다. sgmlinkextractor.

나는이 거미를 몇 주 동안 스크레이프로 만들려고 노력했습니다. 그들은 훌륭한 튜토리얼을 가지고 있지만 나는 Python 및 웹 프로그래밍을 처음 사용하기 때문에 예를 들어 어떻게 이해하지 못합니다. SgmlLinkExtractor 현장 뒤에서 작동합니다.

파이썬 라이브러리와 동일한 간단한 기능을 가진 거미를 쓰려고 시도하는 것이 더 쉬울까요? 의견과 도움을 주셔서 감사합니다.

감사

도움이 되었습니까?

해결책

sgmllinkextractor는 "허용"인수에서 선택기를 지원하지 않습니다.

그래서 이것은 잘못입니다.

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

맞습니다 :

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

다른 팁

구문 분석 기능은 sgmllinkextractor의 각 경기마다 호출됩니다.

Pablo가 언급했듯이 sgmllinkextractor를 단순화하고 싶습니다.

또한 초기 URL에서 긁힌 이름을 목록에 넣고 각 이름을 전달하여 절대 URL 형식으로 구문 분석합니다. 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top