2016-05-31 5 views
1

おはよう、Scrapy - 正規表現に基づいたコンテンツを持つxpath戻りの親ノード

私はScrapyを使用してウェブサイトの情報を再帰的に取得しようとしています。 スタートポイントは、URLをリストするサイトです。 ステップ1:私は次のコードでScrapyでそれらのURL年代を取得

def parse(self, response): 
    for href in response.css('.column a::attr(href)'): 
     full_url = response.urljoin(href.extract()) 
     yield { 'url': full_url, } 

次に、各URLについて、私は、特定のURLの(私は私ので、今、各ステップの別々のをやっているキーワードを含むを探しに行きますよ「Scrapyに新しいmの終わりに、私は1匹のクモでそれを実行したいと思います):。 ステップ2:

def parse(self, response): 
    for href in response.xpath('//a[contains(translate(@href,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"),"keyword")]/@href'): 
     full_url = response.urljoin(href.extract()) 
     yield { 'url': full_url, } 

これまでのところは良いが、その後、最後のステップ:

ステップ3: 私はリターンから特定の情報を取得したいd URL(ある場合)。今、私はトラブルに実行; o)の私は共犯しようとするどのような:値/内容は正規表現と一致する要素そのうち正規表現と

  • 検索:([0-9] [0-9] [0-9 ] [0-9]。* [AZ] [AZ])>>これは1234ABおよび/または1234と一致します。AB
  • 親div全体を返します(可能であれば、上の2つの親を返します。親divはありませんが、それは後で行います)。

以下のHTMLコードを読んだとき、私は親のdiv()の内容を返したいと思います。私はクラスを知らないので、私はそれに一致することはできません。

<html> 
    <head> 
     <title>Webpage</title> 
    </head> 
    <body> 
     <h1 class="bookTitle">A very short ebook</h1> 
     <p style="text-align:right">some text</p> 
      <div class="contenttxt"> 
      <h1>Info</h1> 
     <h4>header text</h4> 

     <p>something<br /> 
     1234 AB</p> 

     <p>somthing else</p> 
     </div> 
     <h2 class="chapter">Chapter One</h2> 
     <p>This is a truly fascinating chapter.</p> 

     <h2 class="chapter">Chapter Two</h2> 
     <p>A worthy continuation of a fine tradition.</p> 
    </body> 
</html> 

私が試しコード:少なくとも、それが何かを見つけることができるように、すべての

2016-05-31 18:59:32 [scrapy] INFO: Spider opened 
2016-05-31 18:59:32 [scrapy] DEBUG: Crawled (200) <GET http://localhost/test/test.html> (referer: None) 
[s] Available Scrapy objects: 
[s] crawler <scrapy.crawler.Crawler object at 0x7f6bc2be0e90> 
[s] item  {} 
[s] request <GET http://localhost/test/test.html> 
[s] response <200 http://localhost/test/test.html> 
[s] settings <scrapy.settings.Settings object at 0x7f6bc2be0d10> 
[s] spider  <DefaultSpider 'default' at 0x7f6bc2643b90> 
[s] Useful shortcuts: 
[s] shelp()   Shell help (print this help) 
[s] fetch(req_or_url) Fetch request (or URL) and update local objects 
[s] view(response) View response in a browser 
>>> response.xpath('//*').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])') 
[u'1234 AB', u'1234 AB', u'1234 AB', u'1234 AB'] 

まず、それは、試合を4回を返します。私は「scrapyのXPath戻り親ノードの検索が、それだけで1つの結果しか得るため、私に「ソリューション」を与えた:私も何かしようとした

>>> response.xpath('//*/../../../..').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])') 
[u'1234 AB'] 

>>> for nodes in response.xpath('//*').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])'): 
...  for i in nodes.xpath('ancestor:://*'): 
...   print i 
... 
Traceback (most recent call last): 
    File "<console>", line 2, in <module> 
AttributeError: 'unicode' object has no attribute 'xpath' 

をしかし、それはしませんでしたどちらも助けてください。 うまくいけば、誰かが私を正しい方向に向けることができればと思います。まず第一に、正規表現が4回マッチングしている理由を私には伝えていないからです。第2に、私がどこに行っても構わないアイデアがないからです。あなたの答えがすでにあるかもしれない質問が示された最も有望な結果を見直しました。しかし、私の解決策は見つからなかった。私の最高の推測は、ループのいくつかの並べ替えを構築する必要があることですが、再び、手がかりはありません。 :■

終わりに私は一緒にステップ3

からのデータと、それはステップ1とステップ2で見つかったURLを含む結果を出力する、おかげで取得しよう! KR、 Onno。

答えて

0

reメソッドは、xpathセレクタが対象の要素を抽出した後にデータを抽出します。詳細はdocumentationを参照してください。要素を知っている場合(おそらくdiv)、すべてのdivの内容をチェックしたり、XPath内の正規表現の組み込みサポートを使用したりできます。このようなあなたの前の例を使用して、何か:

response.xpath('//div[re:test(., "[0-9]{4}\s?[A-Z]{2}")]').extract() 

戻り

[u'<div class="contenttxt">\n   <h1>Info</h1>\n  <h4>header text</h4>\n\n  <p>something<br>\n  1234 AB</p>\n\n  <p>somthing else</p>\n  </div>'] 
関連する問題