2016-10-11 7 views
3

私はscrapyを使用していますが、特定のテキストを含むスパンを探しています。私が持っている:Scrapy Xpathにtext()が含まれています

返し
response.selector.xpath('//*[@class="ParamText"]/span/node()') 

<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>, 
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u'C'>, 

<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>] 

をしかし、私は実行すると:

>>> response.selector.xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]') 
Out[11]: [] 

機能が動作しませ含まれていないのはなぜ?

答えて

8

は、一度に複数のノードを評価することはできません。

/span[contains(text(),"STODOLINK")] 

ので、場合にspan内の複数のテキストノードが存在する、と"STODOLINK"spanの最初のテキストノードの子を配置されていません上記の式のは機能しません。あなたは次のように個々のテキスト・ノード上のチェックを適用しようとする必要があります

//*[@class="ParamText"]/span[text()[contains(.,"STODOLINK")]] 

それとも"STODOLINK"は必ずしも(spanに他の要素内にネストすることができます)span内に直接配置されていない場合、あなたは、単に.を使用することができます代わりにtext()の:(私の例を想定したことはいえ、あなたのファイルと同じです)私の端末で

//*[@class="ParamText"]/span[contains(.,"STODOLINK")] 
+0

ありがとうございました。ここを意味する。私は正規表現のように '任意の文字'を推測していますか? – user61629

+0

要素自体への参照です。さて、 '..'は要素の親への参照です。彼らは* nixシステム(Linux、Macなど)のファイルパスのように動作します。は現在のディレクトリで、 '..'は親ディレクトリです。 –

1

あなたのコードは動作します:

入力

import scrapy 
example='<div class="ParamText"><span>STODOLINK</span></div>' 
scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]').extract() 

出力:

['<span>STODOLINK</span>'] 

あなたは違うかもしれないものを明確することはできますか?

1

私はBeautifulSoup4.0でScrapyを使用します。 IMO、スープは読んで理解しやすいです。これは、HtmlXPathSelectorを使用する必要がない場合のオプションです。以下はすべてのリンクを見つける例です。それを 'span'で置き換えることができます。お役に立てれば!

import scrapy 
from bs4 import BeautifulSoup 
import Item 

def parse(self, response): 

    soup = BeautifulSoup(response.body,'html.parser') 
    print 'Current url: %s' % response.url 
    item = Item() 
    for link in soup.find_all('a'): 
     if link.get('href') is not None: 
      url = response.urljoin(link.get('href')) 
      item['url'] = url 
      yield scrapy.Request(url,callback=self.parse) 
      yield item 
関連する問題