2017-06-07 22 views
0

私はの治療を初めて使用しています。私はウェブからいくつかのデータをクロールしたい。私は以下のようなhtml文書を手に入れました。Pythonで親ノードをscrapyで取得する方法は?

dom style1: 
<div class="user-info"> 
    <p class="user-name"> 
     something in p tag 
    </p> 
    text data I want 
</div> 

dom style2: 
<div class="user-info"> 
    <div> 
     <p class="user-img"> 
      something in p tag 
     </p> 
     something in div tag 
    </div> 
    <div> 
     <p class="user-name"> 
      something in p tag 
     </p> 
     text data I want 
    </div> 
</div> 

は、私は今、私はそれが存在チェックでそれを得るためにCSSまたはのxpathセレクタを使用することができ、私はたいデータテキストデータを取得したいです。しかし、私はいくつかのより良い方法を知りたい。 例えば、私は最初のCSS p.user-nameを得ることができ、その後、私はそれが親を取得し、その後、私はそれがdiv/text()だ取得し、常に私が欲しいデータがp.user-nameの直接の親divtext()ですが、質問があり、直接の親を得るにはどうすればいいですかp.user-name

答えて

3

xpathでは、CSSがこれをサポートしていないすべての方向(親、兄弟、子供など)でxmlツリーをトラバースできます。あなたは、XPath ..親表記にノードの親を取得することができ、あなたのケースでは

//p[@class='user-name']/../text() 

説明:
//p[@class='user-name'] - クラス値user-name<p>ノードを見つけます。
/.. - ノードの親を選択します。
/text() - 現在のノードのテキストを選択します。

このxpathは、上記の両方のケースで動作するはずです。

+0

いいね、ありがとう、ありがとう。 – Simon

1

following-sibling軸はどうですか?

>>> s = scrapy.Selector(text='''<div class="user-info"> 
...  <p class="user-name"> 
...   something in p tag 
...  </p> 
...  text data I want 
... </div>''') 
>>> username = s.css('p.user-name')[0] 
>>> username.xpath('following-sibling::text()[1]').get() 
'\n text data I want\n' 
>>> 

>>> s2 = scrapy.Selector(text='''<div class="user-info"> 
...  <div> 
...   <p class="user-img"> 
...    something in p tag 
...   </p> 
...   something in div tag 
...  </div> 
...  <div> 
...   <p class="user-name"> 
...    something in p tag 
...   </p> 
...   text data I want 
...  </div> 
... </div>''') 
>>> username = s2.css('p.user-name')[0] 
>>> username.xpath('following-sibling::text()[1]').get() 
'\n  text data I want\n ' 
>>> 
+0

ありがとう、しかし、domは私が与えるよりはるかに複雑です。 – Simon

関連する問題