2017-08-03 2 views
0

Ich bin über die Geschwisterknoten eines Elements iterieren. Ich habe jedoch Probleme, die Xpath-Funktion zu verwenden, um die Daten darin zu extrahieren. Ich scheine immer eine leere Liste zu bekommen.Scrapy durch Geschwisterknoten iterieren - XPath ergibt leere Liste

# 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 

In dem obigen Code, ich durch den Geschwister-Knoten weiter, bis ich ein Element treffen, die „Trailer“ „Film Festival“ oder „Kommentare“ irgendwo im Text enthält.

Sonst bekomme ich für jeden Geschwisterknoten zuerst seinen Namen, um herauszufinden, um was für einen Knoten es sich handelt - ich interessiere mich für Tabellen und ungeordnete Listen.

Der Teil, der fehlschlägt, ist jedoch, wenn ich Geschwister.xpath ('./ Tabelle') und/oder Geschwister.xpath ('ul [1]/li') aufrufen.

Das resultierende Objekt ist immer eine leere Liste.

Ich habe Scrapy Shell verwendet und die Liste der Selektoren, die ich von cast_siblings bekomme, untersucht. Jeder Selektor scheint gültig zu sein, und wenn ich sie extrahiere, kann ich die inneren Elemente sehen. Ich kann einfach nicht mit xpath zu ihnen kommen.

Hier ist ein Auszug aus meiner Konsole das leere Liste Ergebnis zeigt:

>>> 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') 
[] 

Das ist wirklich seltsam, da a [1] in dem obigen Beispiel deutlich eine Tabelle innerhalb zeigt.

+0

Können Sie ein Beispiel-URL oder HTML-Körper geben ? Hast du auch nur 'table' ohne'./'Probiert? Vielleicht ist das Tabellenelement nicht geschlossen? – Granitosaurus

+0

@Granitosaurus eine der URLs, mit denen ich arbeite, ist http://asianwiki.com/Affectionate_Time und der Scrapy Shell-Befehl war "Scrapy Shell" http://asianwiki.com/Affectionate_Time " – wayway

+0

@Granitosaurus hier ist eine URL Beispiel mit einer Tabelle unter Besetzung: http://asianwiki.com/No_Longer_Heroine. Ich habe auch gerade versucht, 'table' zu ​​verwenden, aber es ergab auch eine leere Liste. – wayway

Antwort

1

Scheint, wie Sie für Tisch Kinder eines Knotens suchen, der bereits eine Tabelle ist:

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

hier Sie wissen bereits, dass der aktuelle Knotentabelle ist und Sie versuchen, unter es für einen anderen Tisch zu suchen. Also in diesem Fall sollte es nur sein:

cast_tables = sibling 

Es ist auch erwähnenswert, dass, wenn Sie scrapy Selektoren testen die Ergebnisse Wurzelknoten-Tags enthalten, dh '//h1' kehrt <h1>...</h1>

+0

Vielen Dank für die schnelle Antwort! Das hat mein Problem behoben. Ich war definitiv beunruhigt darüber, dass die Root-Node-Tags in der Scrapy-Shell enthalten sind, und ich werde dies von jetzt an im Hinterkopf behalten ~ Danke! – wayway