2016-04-05 10 views
1

Ich schreibe einen Python-Code mit Lxml, Urllib und CSV, um die Sprache in a Brazil government site zu kratzen.Extrahieren von Datum und anderen Daten aus Scraped-Elementen

Ich konnte den Titel und den Link für jede Rede mit XPath finden, aber nicht den genauen Tag, da es für das Datum der Rede kein bestimmtes Tag gibt.

Wenn ich den XPath benutze, bringt der Scraper den Tag, die Stunde und das Wort "Página" (Seite, in Portugiesisch) zurück. Ich weiß, dass Xpath nicht stimmt, aber ich weiß nicht, wie ich nur den Tag auswählen soll.

Auch mit diesem Fehler konnte ich den verschrotteten Inhalt in eine Liste umwandeln und bearbeiten, um alles außer den Tagen zu löschen. Das Problem ist, dass die endgültige Liste, wie Sie unten sehen können, einige andere Zeichen hat, die ich nicht löschen kann.

Hier scheint es zwei Lösungen zu geben: Holen Sie den XPath nach rechts oder bearbeiten Sie die anderen Zeichen in der Liste. Wie kann ich irgendwas von ihnen machen?

['\ n 18/12/2015 \ n', '\ n 21/12/2015 \ n', '\ n 21/12/2015 \ n', '\ n 22/12/2015 \ n ',' \ n 22/12/2015 \ n ',' \ n 22/12/2015 \ n ',' \ n 11/01/2016 \ n ',' \ n 19/01/2016 \ n ' "\ n 21/01/2016 \ n", "\ n 26/01/2016 \ n", "\ n 27/01/2016 \ n", "\ n 27/01/2016 \ n", " \ n 28/01/2016 \ n ',' \ n 01/02/2016 \ n ',' \ n 01/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 03/02/2016 \ n ',' \ n 03/02/2016 \ n ',' \ n 19/02/2016 \ n ',' \ n 1 9/02/2016 \ n ',' \ n 22/02/2016 \ n ',' \ n 26/02/2016 \ n ',' \ n 26/02/2016 \ n ',' \ n 02/03/2016 \ n ',' \ n 03/03/2016 \ n ',' \ n 04/03/2016 \ n ',' \ n 07/03/2016 \ n ',' \ n 04/02/2016 \ n ',' \ n 08/03/2016 \ n ',' \ n 09/03/2016 \ n ',' \ n 17/03/2016 \ n ',' \ n 18/03/2016 \ n ',' \ n 22/03/2016 \ n ',' \ n 23/03/2016 \ n ',' \ n 23/03/2016 \ n ',' \ n 30/03/2016 \ n ' '\ n 31/03/2016 \ n', '\ n 01.04.2016 \ n']

+1

einfach die weißen Flächen Streifen um '[d.strip() für d in ds]' –

Antwort

1

Versuchen Sie, die followin XPath das Ergebnis nur die Termine zu verengen:

//span[@class="summary-view-icon"][i/@class="icon-day"]/text()[normalize-space()] 

Das letzte Bit des oben XPath (text()[normalize-space()]) gibt nur nicht leer Textknoten.Von hier aus müssen Sie noch unnötigen Leerzeichen mit strip() entfernen:

query = '//span[@class="summary-view-icon"][i/@class="icon-day"]/text()[normalize-space()]' 
dates = root.xpath(query) 
result = [date.strip() for date in dates] 
1

Sie können alle Zeilenumbrüche/Leerzeichen aus den Elementen in der Liste entfernen, indem Sie strip verwenden:

new_list = [item.strip() for item in old_list] 

bearbeiten: Sie sagen, Sie die Ergebnisse in die Liste in Ihrer Frage in diesem Fall verwandeln können Sie nur die Elemente dort abstreifen konnten.

1

Hier ist mit einem regular expression:

dates = [re.search(r'\d{2}/\d{2}/\d{4}', item, re.MULTILINE).group(0) for item in old_list] 

Gibt:

['18/12/2015', '21/12/2015', '21/12/2015', '22/12/2015', '22/12/2015', 
'22/12/2015', '11/01/2016', '19/01/2016', '21/01/2016', '26/01/2016', 
'27/01/2016', '27/01/2016', '28/01/2016', '01/02/2016', '01/02/2016', 
'02/02/2016', '02/02/2016', '02/02/2016', '03/02/2016', '03/02/2016', 
'19/02/2016', '19/02/2016', '22/02/2016', '26/02/2016', '26/02/2016', 
'02/03/2016', '03/03/2016', '04/03/2016', '07/03/2016', '04/02/2016', 
'08/03/2016', '09/03/2016', '17/03/2016', '18/03/2016', '22/03/2016', 
'23/03/2016', '23/03/2016', '30/03/2016', '31/03/2016', '01/04/2016'] 

Diese helfen mit Daten mehr Varianz oder könnten unerwartete Formatierung

3

Diese erhalten Sie, was Sie wollen:

items = response.xpath('//div[@id="content-core"]//div[contains(@class, "tileItem")]') 
for item in items: 
    date = item.xpath('normalize-space(.//span[@class="summary-view-icon"][i[@class="icon-day"] ]//text()[normalize-space()])') 

normalisieren-Raum Mit zweimal leer Ergebnisse + Streifen des Endergebnisses alle Leerzeichen löschen abzustreifen.

1

Sie können Regex verwenden, um das Datum im gewünschten Format ohne die zusätzlichen Zeichen zu extrahieren.

in der Seitenstruktur Basierend Ich habe einen Nahkämpfer mit Re entwickelt zu zeigen, wie ich es tun würde:

import requests, re 
from lxml import etree 


def get_speeach_data(item): 
    title = item.xpath('.//h2[@class="tileHeadline"]/a/text()')[0] 

    sidebar = item.xpath('./span[@class="documentByLine"]')[0] 
    sidebar_html = etree.tostring(sidebar) 

    m = re.search(r'(\d+/\d+/\d+)', sidebar_html) 
    date = m.group(1) 

    m = re.search(r'(\d+h\d+)', sidebar_html) 
    hour = m.group(1) 

    return { 'title' : title, 'date' : date, 'hour' : hour } 



if __name__ == '__main__': 
    url = 'http://www2.planalto.gov.br/acompanhe-o-planalto/discursos/discursos-da-presidenta?b_start:int=0' 

    r = requests.get(url) 

    if r.status_code == 200: 
     page = etree.HTML(r.content) 

     raw_speeaches = page.xpath('//*[@id="content-core"]/div') 
     speeaches = map(get_speeach_data, raw_speeaches) 
     print speeaches 
+0

Groß! Danke für Ihre Hilfe –