2017-09-11 6 views
0

私はPythonで新しく、の治療にのURLをたどるのに苦労しています。私はそれがxpath仕様であるかもしれないと思うが、トピックに関するいくつかのチュートリアルを行った後、私はこれを解決することに近づくことはない。参照されたテーブルのURLをループし、開始ページから繰り返しコンテンツをスクレイプします。私は間違って何をしていますか?Python Scrapy XpathがURLに従っていない

添付コード:

import scrapy 
from scrapy.selector import Selector 
from scrapy.spiders import CrawlSpider 
from scrapy.spiders import Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.http import Request 

class MySpider(CrawlSpider): 
    name = 'unespider' 
    allowed_domains = ['https://my.une.edu.au/'] 
    start_urls = ['https://my.une.edu.au/courses/'] 
    rules = Rule(LinkExtractor(canonicalize = True, unique = True), follow = True, callback = "parse"),  

    def parse(self, response): 
     hxs = Selector(response) 
     for url in response.xpath('//*'): 
     yield { 
      'title': url.xpath('//*[@id="main-content"]/div/h2/a/text()').extract_first(), 
      'avail': url.xpath('//*[@id="overviewTab-snapshotDiv"]/p[3]/a/text()').extract_first(), 
       }  

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

よく問題がたくさんあります。 'allowed_domains'はドメイン名を持ち、URLは' allowed_domains = ['my.une.edu.au'] 'ではありません。解析関数はクラスの内部にある必要があります。 'hxs = Selector(response)'を使う必要はありません。 'LinkExtractor'では、あなたはスパイダーがブラウザにしたいと思うリンクのためのパターンを与えるべきです。 'ルール(LinkExtractor(allow =(" https://my.une.edu.au/courses/2017/courses/.+ "、)、canonicalize = True、unique = True)、follow = True、callback =" parse_course ")'。 CrawlSpiderの 'parse'メソッドをオーバーライドしないでください。ルールがそれを行うなら、あなたの関数でRequestを返さないでください。 –

+0

私に戻ってくれてありがとうございました。私はあなたが提案した変更を加えましたが、同様の動作を示します。つまり、テーブルのURLをループしますが、何もコピーしません。何が間違っているのか分かりません。 – DaveSim

答えて

0

**私はあなたが望んでいたものを見る更新と更新されたコード、それは正しい、毎年および出力のために、以下の**

私は私が何かわからないことを謝罪開始ページからの追いかけと掻き取り、// * [@ id = "overviewTab-snapshotDiv"]。私はそのxpathを見つけることができませんでした。私はプログラミングや治療にはかなり新しいものですから、もっと手伝っていきたいと思います。最初は自分でクラススクレイパーを作ってしまったので、私は自分のやり方でやることができました。より良いです:) あなたのタイトルとURLを掻き取るためのコードを実行しましたが、私はあなたの追いかけようとしている理由が分からないので、ルールをコメントアウトしました。

items.pyのための今
import scrapy 
from scrapy.spiders import Rule 

from scrapy.linkextractors import LinkExtractor 

from overflowQuestion2 import items #make sure to import items.py 


class DavesimSpider(scrapy.Spider): 

    name = 'daveSim' 
    allowed_domains = ['my.une.edu.au'] 
    start_urls = ['http://my.une.edu.au/courses/2007', ] #start at 2007 
    rules = Rule(LinkExtractor(canonicalize=True, unique=True), follow=True, callback="parse") 


def parse(self, response): #This will scrape links and follow 

    #Grab the main Div wrapping the links 
    divLinkWrapper = response.xpath('//div[@class="pagination"]') 
    for links in divLinkWrapper: #for every element extract links 
     theLinks = links.xpath('ul/li/a/@href').extract() 
     for i in theLinks: #for every link, follow link 
      yield scrapy.Request(i, callback=self.ContentParse) 



def ContentParse(self, response): #scrape content you want 

    #Grab main Div wrapper for content 
    divMainContent = response.xpath('//div[@id="main-content"]') 

    for titles in divMainContent: 
     #create Item object from items.py function 
     Item = items.Overflowquestion2Item() 
     theTitles = titles.xpath('div[@class="content"]//a/text()').extract() 

     #set Item to the scrapy.Field in items.py 
     Item['title'] = theTitles 
     yield Item #yield Item through pipeline 

    for URLs in divMainContent: 
     Item = items.Overflowquestion2Item() 
     theURLs = URLs.xpath('//table/tr/td/a/@href').extract() 
     Item['URL'] = theURLs 
     yield Item 

import scrapy 


class Overflowquestion2Item(scrapy.Item): 
    # define the fields for your item here like: 
    # name = scrapy.Field() 
    title = scrapy.Field() 
    URL = scrapy.Field() 

    pass 

はまた、私は、これはより良いコード化することができポジティブだと私が誰かを願っています

ITEM_PIPELINES = { 
    'overflowQuestion2.pipelines.Overflowquestion2Pipeline': 300, 
} 

、アイテムのパイプラインのコメントを解除する設定で覚えていますここにそれを改良する;)

+0

あなたのために機能しましたか? –

+0

いいえいいえ テーブルのURLをループし、開始ページからxpathをコピーし、ループをたどることはありません – DaveSim