2016-03-24 9 views
0

私はscrapyを使用しています。何か数字を入力し、ダッシュを続け、数字の後に空白を入れ、次に2文字-3mm)。それはxpath 1.0正規表現の使用を許可していないようです。私はstart-with()とends-with()のようないくつかの回避策を見いだしましたが、私が見たことからは文字でしか使用していませんでした。助けてください。xpath 1.0のcontains関数を使用して数値を選択する

答えて

3

があった場合Scrapyは内部lxmlを使用し、lxml's XPath has support for regular expressions via EXSLTあなたは、対応する名前空間を追加するとき。

デフォルトでは、治療はそのようにしてyou can use re:test() within XPath expressionsを述語のブール値として使用します。

boolean re:test(string, string, string?) 

再:最初の引数として与えられた文字列が2番目の引数として与えられた正規表現に一致する場合、テスト関数は真を返します。

>>> import scrapy 
>>> t = u"""<!DOCTYPE html> 
... <html lang="en"> 
... <body> 
... <p>ab-34mm</p> 
... <p>102-d mm</p> 
... <p>15-22 µm</p> 
... <p>1-3 nm</p> 
... </body> 
... </html>""" 
>>> selector = scrapy.Selector(text=t) 
>>> selector.xpath(r'//p/text()[re:test(., "\d+-\d+\s\w{2}")]').extract() 
[u'15-22 \xb5m', u'1-3 nm'] 
>>> 

編集:

この例Python2セッションを参照してくださいEXSLT re:matchを使用するEXSLT re:match

を使用して注意することは少しトリッキー、またはre:testよりも少なくとも小さい自然です。 re:matchは同様であるシグネチャがre:test異なるMatchObject

を返すPythonのre.match

object regexp:match(string, string, string?) 

正規表現:match関数は、一致要素のノードセットを返す

だからre:match<match>要素を返します。これらの<match>要素から文字列を取得するには、関数を述語の内部ではなく「外部」関数として使用する必要があります。

次の例鎖XPath式、

  1. が最終的にこれらre:matchの結果を抽出括弧グループ
  2. を含む正規表現を用いて、各段落の文字列値(正規化)に一致次いで<p>段落
  3. を選択電話

Python2シェル:

>>> for p in selector.xpath('//p'): 
...  print(p.xpath(ur're:match(normalize-space(.), "(\d+)-(\d+)\s(\w{2})")').extract()) 
... 
[] 
[] 
[u'<match>15-22 \xb5m</match>', u'<match>15</match>', u'<match>22</match>', u'<match>\xb5m</match>'] 
[u'<match>1-3 nm</match>', u'<match>1</match>', u'<match>3</match>', u'<match>nm</match>'] 
>>> 
0

xpath 1.0でこれを行うには、translate関数を使用できます。

translate(@test , '1234567890', '..........')は、任意の数字(数字)をドットで置き換えます。

あなたの番号は常に1桁あなたが何かしようとしている場合は、次の数字が長い桁上よりもできれば

[translate(@test , '1234567890', '..........') = '.-. mm'] 

をあなたは- mm

[translate(@test , '1234567890', '') = '- mm'] 
のために何もしてテストして番号を交換しようとするかもしれません

しかし、これはいくつかののfalse truesを持つことができます。それらを避けるために、あなたがサブ-前-after長に確認する必要があります少なくとも一桁

+0

申し訳ありませんが、私は混乱しています。私が必要とするものが自分自身である場合、なぜ数字をドットで置き換えるのですか? –

+0

私は特別な形式の数字を含むノードを選択する必要があると思った。これが間違っているならば、目標は数字を抽出することですか?既に選択されたノードからですか? –

+0

ポール・トムブルトの答えはまさに私が必要とするものだと思います。とにかくありがとう! :) –

関連する問題