2017-07-18 13 views
0

ウェブサイトhttp://www.apkmirror.com/apk/opera-software-asa/opera-mini/opera-mini-28-0-2254-119213-release/opera-mini-fast-web-browser-28-0-2254-119213-2-android-apk-download/では、Item Loadersを使用して同じXPathセレクタからいくつかのフィールドを抽出しようとしています。コードの繰り返しを避けるため、nested_xpathメソッドを使用したいと思います。「すべて」の相対XPathセレクタ

この目的のために、私は相対XPathセレクタを本質的に「ノーオペレーション」にして、入力選択を元に戻したいと思います。私は.//*と思ったが、これはうまくいかない。

私は

scrapy shell http://www.apkmirror.com/apk/opera-software-asa/opera-mini/opera-mini-28-0-2254-119213-release/opera-mini-fast-web-browser-28-0-2254-119213-2-android-apk-download/ -s USER_AGENT=Mozilla 

でScrapyシェルを起動する場合は、次のXPath式は私に望ましい結果得られます。

In [2]: response.xpath('//*[@title="APK details"]/following-sibling::*//text()') 
    ...: .extract() 
Out[2]: 
['Version: 28.0.2254.119213 (281119213)', 
'arm ', 
'Package: com.opera.mini.native', 
'\n', 
'183 downloads '] 

を私は.xpath('.//*')でこれを連結しようとする場合は、結果になり空リスト:

正しい 'いいえこの場合、-op 'XPathセレクター?

+1

「no-op XPathセレクタ」_の意味を理解できません。アイテムローダーとnested_xpathを使用していくつかのサンプルHTMLと期待される出力でいくつかのコードを共有できますか? –

+1

@KurtPeek本当にうーん。多分あなたは 'response.xpath( '// * [@ title =" APK details "]/following-sibling :: *')のように' text() 'を連鎖したxpathに移すことができます。 () ')。extract() ' – Psidom

+1

注:lxml(およびScrapy by extension)では、テキストノードをそれ以降のXPath式に適用することはできません。これは制限(またはバグ)です。だから 'response.xpath( '.... // text()').xpath( './ some/xpath')'は常に空の結果を返します。 –

答えて

0

Psidompaul trmbrthのコメントに続いて、私は最後にtext()をチェーンXPathに移動しました。したがって、コードの繰り返しはtext()ですが、XPath式全体よりも少なくなります。

関連する問題