2017-08-03 18 views
0

要素の兄弟ノードを反復処理しています。しかし、私はxpath関数を使用してデータを抽出するのに問題があります。私はいつも空リストを得ているようです。上記のコードで兄弟ノードを反復処理する - xpathが空のリストを返す

# Determine if the cast members are listed in a table or unordered list. 
cast_siblings = response.xpath('//h2/span[starts-with(@id,"Cast")]/../following-sibling::*') 
for sibling in cast_siblings: 
    desc_str = "".join(sibling.xpath('./descendant::text()').extract()) 
    if "Trailer" in desc_str or "Film Festival" in desc_str or "Comment" in desc_str: 
     break 

    # Extract the name to get the type of the node. 
    node_type = sibling.xpath('name()').extract_first() 
    if node_type == 'ul': 
     cast_list = sibling.xpath('./ul[1]/li') 
     self.parse_list_into_cast_table(cast_list, _id, conn) 
    elif node_type == 'table': 
     cast_tables = sibling.xpath('./table') 
     self.parse_table_into_cast_table(cast_tables, _id, conn) 
    else: 
     print "Unknown cast element type! " + _id 

、私は、「予告編」「映画祭」や「テキスト内のコメント」どこかが含まれている要素を打つまで、兄弟ノードを経由しておきます。

それ以外の場合は、兄弟ノードごとに、そのノードの種類を調べるために名前を取得します。テーブルと順序付けられていないリストに興味があります。

しかし、失敗する部分は、sibling.xpath( './ table')および/またはsibling.xpath( 'ul [1]/li')を呼び出すときです。

結果オブジェクトは常に空のリストです。

私はscrapyシェルを使用し、cast_siblingsから取得したセレクタのリストを調べました。各セレクタは有効であるように見えます。それらを抽出すると、内側の要素を見ることができます。私はxpathを使ってそれらに到達できません。ここで

は空のリストの結果を示す私のコンソールからの抜粋です:[1]上記の例ではっきり内のテーブルを示しているので

>>> a = response.xpath('//h2/span[starts-with(@id,"Cas")]/../following-sibling::*') 
>>> a 
[<Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h3> <span class="mw-headline" id="Sudo_'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h3> <span class="mw-headline" id="Maruy'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h3> <span class="mw-headline" id="Azumi'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h3> <span class="mw-headline" id="Prese'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<p><b>Additional Cast Members:</b>\n</p>'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<ul><li> <a href="/Yukari_Ito" title="Yu'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h2> <span class="mw-headline" id="Trail'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<p>\n<script type="text/javascript" src="'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<div id="mediaplayer"></div>'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<script type="text/javascript">\n jwplay'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h2> <span class="mw-headline" id="Comme'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<br>'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<div id="comment-outer"><hr><div id="com'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<div align="center"></div>'>, <Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table cellpadding="2" style="border:0px'>] 
>>> a[0] 
<Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<h3> <span class="mw-headline" id="Sudo_'> 
>>> a[1] 
<Selector xpath='//h2/span[starts-with(@id,"Cas")]/../following-sibling::*' data=u'<table border="0" cellspacing="3" cellpa'> 
>>> a[1].xpath('./table') 
[] 

これは本当に奇妙です。すでにテーブルであるノードのテーブルの子を探しているよう

+0

は、あなたが例のURLやHTMLのボディを与えることができる戻ります?また、 '。/'なしで 'table'だけを試しましたか?テーブル要素が閉じられていない可能性がありますか? – Granitosaurus

+0

@Granitosaurus私が扱っているURLの1つはhttp://asianwiki.com/Affectionate_Timeで、scrapyシェルコマンドは 'scrapy shell 'でした。http://asianwiki.com/Affectionate_Time" ' – wayway

+0

@GranitosaurusはURLです例:キャストの下のテーブル:http://asianwiki.com/No_Longer_Heroine。私も 'table'を使って試しましたが、空のリストも得ました。 – wayway

答えて

1

は思え:

ここ
node_type = sibling.xpath('name()').extract_first() 
if node_type == 'ul': 
    ... 
elif node_type == 'table': 
    cast_tables = sibling.xpath('./table') <--- 

あなたはすでに現在のノードがテーブルであることを知って、あなたはその下に別のテーブルを探すためにしようとしています。したがって、この場合はそれだけでする必要があります:それはまた、あなたがscrapyセレクタをテストするときの結果は、ルートノードのタグが含まれていることは注目に値します

cast_tables = sibling 

、すなわち'//h1'<h1>...</h1>

+0

このような迅速な対応をありがとう!これは私の問題を解決しました。私は間違いなくscrapシェルに含まれているルートノードのタグに悩まされていました。 – wayway

関連する問題