2016-04-10 5 views
1

Ich Aktualisierung dieses Tutorial Artikel mit XPath bekommen, weil es veraltet ist:
http://mherman.org/blog/2012/11/05/scraping-web-pages-with-scrapy/#.VwpeOfl96UlWie in scrapy

Es sollte den Link und Titel der einzelnen Job holen für NPOs auf Craigslist-Eintrag. Der Link wird abgerufen, der Titel jedoch nicht.

Dies ist der Code der Seite für dieses Element:

<span class="pl"> 
    <time datetime="2016-04-09 14:10" title="Sat 09 Apr 02:10:57 PM">Apr 9</time> 
    <a href="/nby/npo/5531527495.html" data-id="5531527495" class="hdrlnk"> 
    <span id="titletextonly">Therapist</span> 

Dies ist der Code des Crawlers:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    titles = hxs.xpath("//span[@class='pl']") 
    items = [] 
    for titles in titles: 
     item = CraigslistSampleItem() 
     item["title"] = titles.select("a/text()").extract() 
     item["link"] = titles.select("a/@href").extract() 
     items.append(item) 
    return items 

Wenn ich das Element in Chrome zu untersuchen und den XPath, ich hol dir das für die Titel: // * [@ id = 'titeltextonly'], aber das gibt mir die ganze Liste der Titel, nicht nur die für den Link (in diesem Fall sollte ich '/ nby/npo/5531527495.html für Link und "Therapeut" für Titel)

Ich kenne die Linie

item["title"] = titles.select("a/text()").extract() 

Bedarf aktualisiert werden, aber wenn ich //*[@id='titletextonly'] gebe ich jeden einzelnen Titel erhalten, so ich in der Nähe bin, aber ich weiß nicht, wie die XPath bekommen für ‚titletextonly‘ innerhalb des 'href' Elements.

Ich bin neu zu Scrapy und Xpath also bitte seien Sie nett in Ihren Kommentaren.

Vielen Dank.

Antwort

1

Ändern Sie den X-Pfad wie folgt, um bis "span" zu durchlaufen.

item["title"] = titles.select("a/span/text()").extract() 
+0

Das tat es, danke! – Tensigh

1

a/text() nur Textelemente auswählen, die direkte Kinder des a Element sind. Der gewünschte Text ist kein Kind des Elements a; Es ist innerhalb der span.

Ich habe nicht verwendet scrapy, aber ich schlage vor, versucht, dies:

item["title"] = titles.select("a").extract() 

dies sollte den String-Wert des a Element erhalten, die den gesamten Text im Inneren einschließen würde.

Wenn das nicht funktioniert, können Sie auch versuchen:

item["title"] = titles.select("a//text()").extract() 
+0

Danke für die Antwort. – Tensigh