2017-09-20 1 views
1

Dies ist die URL Ich habe es ausprobiert. Ich habe versucht, den Körperinhalt des Artikels zu bekommen; "Co-Viewing im Fernsehen ...". Ich habe die folgenden Ausdrücke ausprobiert:Scrapy XPath funktioniert nicht (vielleicht etwas mit Parbase?)

[In 1]:response.xpath("//*[contains(@class, 'text parbase')]//text()").extract() 
[Out 1]:[] 

[In 2]:response.xpath("//*[contains(@class, 'text')]//text()").extract() 
[Out 2]: [u'\n', 
u'\n', 
u'\n\n', 
u'\n $CQ(function() {\n  CQ_Analytics.SegmentMgr.loadSegments("/etc/segmentation");\n   CQ_Analytics.ClientContextUtils.init("","/content/corporate/us/en/insights/journal-of-measurement/volume-1-issue-2/nott-alone-is-ott-making-it-cool-again-to-watch-tv-together");\n\n  \n });\n', 
u'\n'] 

[In 3]:response.xpath("//p//text()").extract() 
[Out 3]:[u'X'] 

Und keiner von ihnen scheint zu enthalten, was ich es erhalten möchte. Mache ich hier etwas falsch? Wenn dies bereits beantwortet wurde, tut mir leid, ich habe mein Bestes versucht, um eine Antwort zu finden, habe aber noch nichts gefunden. Jede Hilfe würde sehr geschätzt werden. Danke!

+0

Was ist ihr Inhalt? und was erwartest du, ihr Inhalt zu sein? – VMRuiz

+0

@VMRuiz Der gesamte Text, der in allen p Elementen in div [@ class = "text parbase toptext"] gespeichert ist –

+0

Soweit ich sehen kann, ist Ihr Code richtig. Es scheint einen Fehler im HTML-Code zu geben, durch den die scrapy-Analyse den Abschnitt, auf den Sie zugreifen möchten, nicht laden kann. – VMRuiz

Antwort

1

Es scheint ein Problem mit der HTML-Ausgabe der Website zu geben, und der Scrapy-Parser kann diesen Abschnitt nicht darstellen. Sie könnten den Inhalt mit Hilfe von regulären Ausdrücken extrahieren ein Update auf das bekommen:

import re 
from scrapy import Selector 

section = re.match(r'.*(<div.*?parbase toptext.*?)</div>', response.body, re.DOTALL).group(1) 
Selector(text=section).xpath('//text()').extract() 
+1

Dies scheint gut zu funktionieren; und es ist auch leicht erweiterbar. Vielen Dank! –

1

Von dem, was ich die Seite sehen kann, enthält die folgende Zeile:

<li><script src="https://apis.google.com/js/platform.js" asyncdefer=[NULL][NULL] 

wo [NULL] steht für einen Null-Byte.

Dies scheint den Parser zu werfen. Wenn ich einen Selektor konstruiere, der den response body mit entfernten Nullbytes verwendet, funktioniert es.

+0

In solchen Fällen möchte ich, dass stackoverflow erlaubt mehrere Antworten zu akzeptieren. Beide Antworten hier funktionieren gut; Ich wählte den anderen aus, da er etwas früher als du antwortete. Entschuldigung und danke! –