2017-08-27 4 views
-1

I 3 verschiedene Variationen von LinkExtractor versucht, aber es ist immer noch die ‚leugnen‘ Regel ignorieren und Sub-Domains in allen drei Variationen kriechen .... Ich möchte die Sub-Domains von der auszunehmen kriechen.Scrapy: Linkextractor Regel nicht funktioniert

mit 'erlauben' Regel nur versucht. Damit nur die Haupt-Domain heißt example.edu.uk

rules = [Rule(LinkExtractor(allow=(r'^example\.edu.uk(\/.*)?$',)))] // Not Working 

versucht, mit 'Verweigern' Regel nur. Zu leugnen, alle Sub-Domains dh sub.example.edu.uk

rules = [Rule(LinkExtractor(deny=(r'(?<=\.)[a-z0-9-]*\.edu\.uk',)))] // Not Working 

mit beiden Versuchte 'erlauben & deny' -Regel

rules = [Rule(LinkExtractor(allow=(r'^http:\/\/example\.edu\.uk(\/.*)?$'),deny=(r'(?<=\.)[a-z0-9-]*\.edu\.uk',)))] // Not Working 

Beispiel:

Folgen diese Verbindungen

  • example.edu.uk/fsdfs.htm
  • example.edu.uk/nkln.htm
  • example.edu.uk/vefr.htm
  • example.edu.uk/opji.htm

Verwerfen Sub-Domain Links

  • sub-domain.example.edu.uk/fsdfs.htm
  • sub-domain.example.edu.uk/nkln.htm
  • sub-domain.example.edu.uk/vefr.htm
  • sub-domain.example.edu.uk/opji.htm

ist der komplette Code ...

class NewsFields(Item): 
    pagetype = Field() 
    pagetitle = Field() 
    pageurl = Field() 
    pagedate = Field() 
    pagedescription = Field() 
    bodytext = Field() 

class MySpider(CrawlSpider): 
    name = 'profiles' 
    start_urls = ['http://www.example.edu.uk/listing'] 
    allowed_domains = ['example.edu.uk'] 
    rules = (Rule(LinkExtractor(allow=(r'^https?://example.edu.uk/.*',))),) 
    def parse(self, response): 
     hxs = Selector(response) 
     soup = BeautifulSoup(response.body, 'lxml') 
     nf = NewsFields() 
     ptype = soup.find_all(attrs={"name":"nkdpagetype"}) 
     ptitle = soup.find_all(attrs={"name":"nkdpagetitle"}) 
     pturl = soup.find_all(attrs={"name":"nkdpageurl"}) 
     ptdate = soup.find_all(attrs={"name":"nkdpagedate"}) 
     ptdesc = soup.find_all(attrs={"name":"nkdpagedescription"}) 
     for node in soup.find_all("div", id="main-content__wrapper"): 
      ptbody = ''.join(node.find_all(text=True)) 
      ptbody = ' '.join(ptbody.split()) 
      nf['pagetype'] = ptype[0]['content'].encode('ascii', 'ignore') 
      nf['pagetitle'] = ptitle[0]['content'].encode('ascii', 'ignore') 
      nf['pageurl'] = pturl[0]['content'].encode('ascii', 'ignore') 
      nf['pagedate'] = ptdate[0]['content'].encode('ascii', 'ignore') 
      nf['pagedescription'] = ptdesc[0]['content'].encode('ascii', 'ignore') 
      nf['bodytext'] = ptbody.encode('ascii', 'ignore') 
      yield nf 
      for url in hxs.xpath('//p/a/@href').extract(): 
      yield Request(response.urljoin(url), callback=self.parse) 

Kann jemand bitte helfen? Dank

+0

Post einige Beispiel Links auch, dass Sie verarbeitet werden wollen und diejenigen, die Sie nicht verarbeitet werden möchten –

+0

Auch bitte, wenn Sie sagen, nicht funktioniert, was ist Das passiert uns? Post-Protokolle wenn möglich –

+0

Hallo @TarunLalwani Was ist es, dass Sie nicht in meiner Frage zu verstehen? Alle Links in der Hauptdomain müssen gecrawlt werden und alle Links unter Subdomains müssen verworfen werden. Wie auch immer, ich habe die Frage aktualisiert. Siehe oben. – Slyper

Antwort

0

Ihre ersten 2 Regeln sind falsch

rules = [Rule(LinkExtractor(allow=(r'^example\.edu.uk(\/.*)?$',)))] // Not Working 
rules = [Rule(LinkExtractor(deny=(r'(?<=\.)[a-z0-9-]*\.edu\.uk',)))] // Not Working 

Der erlauben oder zu verbieten sind für absolute URLs und nicht die Domäne.Die unten sollte für Sie arbeiten

rules = (Rule(LinkExtractor(allow=(r'^https?://example.edu.uk/.*',))),) 

Bearbeiten-1

Zuerst unter

allowed_domains = ['example.edu.uk'] 

zu

allowed_domains = ['www.example.edu.uk'] 

Zweite Ihre Regeln zum Extrahieren URL ändern sollte sollte

rules = (Rule(LinkExtractor(allow=(r'^https?://www.example.edu.uk/.*',))),) 

Drittens in Ihrem Code unten

for url in hxs.xpath('//p/a/@href').extract(): 
     yield Request(response.urljoin(url), callback=self.parse) 

Regeln nicht angewandt werden. Ihre Erträge unterliegen Regeln. Die Regel fügt eine neue Anfrage automatisch ein, aber sie hindert Sie nicht daran, andere Links zu liefern, die von der Regelkonfiguration nicht erlaubt sind. Aber die Einstellung allowed_domains gilt für beide Regeln und Ihre Ausbeute

+0

Danke @TarunLalwani Ich habe versucht, Ihren Code, aber immer noch Sub-Domain-Seiten. Sieht so aus, als müsste ich die Sub-Domain in der Regel explizit ablehnen. – Slyper

+0

Veröffentlichen Sie den kompletten Schaber in Ihrer Frage –

+0

Hi @TarunLalwani siehe oben. Vollständiger Code hinzugefügt. – Slyper

Verwandte Themen