2016-04-21 4 views
1

Ich versuche, die HTML von verschiedenen Artikeln mit Scrapy zu bekommen. Diese Artikel enthalten auch Bilder, die ich separat verarbeiten möchte.Wie kann ich Bilder aus HTML Scrapy mit XPath filtern?

Wenn ich einen Artikel haben, deren HTML wie folgt aussieht:

<div class="article> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <img src="/path/to/image.jpg"/> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

Wie kann ich nur den Nicht-Bild HTML kratzen, oder dies:

<div class="article> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

ich zur Zeit habe versucht:

article = response.xpath("//div[@class='article'][not(img)]").extract() 

... aber dies beinhaltet immer noch die Bilder.

Antwort

1

XPath für die Auswahl ist nicht Transformation oder Umlagerung.

Sie können die div Elemente auswählen, die keine img Kinder haben:

//div[@class='article' and not(img)] 

oder haben keine img Abkömmlinge:

//div[@class='article' and not(.//img)] 

Oder Sie die Inhalte der div Elemente auswählen können, sind :

//div[@class='article']/p 

oder das ist nicht img:

//div[@class='article']/*[not(self::img)] 

Aber Sie können die angeforderte HTML nicht wählen,

<div class="article"> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

denn das ist eine Umlagerung, nicht eine Auswahl, von Markup, das im Eingabedokument vorhanden ist.

+0

Bekam es - das ist der Grund, warum die andere Antwort ('// div [@ class = 'article']/* [nicht (self :: img)]') überhaupt _nothing_ zurückgab ... weil die Artikel I versuche ich Bilder auszuwählen und das würde nur Artikel auswählen, die keine Bilder haben? – YPCrumble

+0

Der XPath, den Sie in Ihrem Kommentar erwähnen, würde alle Nicht-Image-Child-Elemente aller Artikel-Div-Elemente auswählen. Wenn Sie nichts auswählen und Sie überraschen, müsste ich den HTML-Code sehen, um mehr zu sagen. – kjhughes

0

Versuchen Sie, den folgenden Code:

article = response.xpath("//div[@class='article']//*[not(self::img)]").extract()