2016-10-24 4 views
0

Ich versuche, eine XML-Datei zu analysieren, die voller Artikel aus einer Zeitung ist, speichern Sie es in einem JSON-Format, speichern Sie es in einer Liste und später Bulk-Index mit elasticsearch. Von jedem Artikel möchte ich das Veröffentlichungsdatum, die Art des Artikels (Werbung, normaler Artikel etc.) sowie dessen Titel und Inhalt erfahren. Das Problem, das ich damit habe, ist, dass ich Schwierigkeiten habe, den Titel des Artikels von seinem Inhalt zu trennen.Parsing von XML mit BeautifulSoup

Ein Beispiel für einen der Artikel hier gezeigt wird:

<pm:KBroot xmlns:pm="http://www.politicalmashup.nl" recordfile=""> 
<pm:root> 
<pm:docinfo/> 
<pm:meta> 
<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">1923-03-01</dc:date> 
<dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/">artikel</dc:subject> 
<dc:identifier xmlns:dc="http://purl.org/dc/elements/1.1/" 
>ddd:010563762:mpeg21:p001:a0005</dc:identifier> 
<dc:source xmlns:dc="http://purl.org/dc/elements/1.1/"> 
<dc:source> 
<pm:link pm:source="832675288" pm:description="De Telegraaf"/> 
</dc:source> 
</dc:source> 
</pm:meta> 
<pm:content pm:source="http://kranten.kb.nl/view/article/id/ddd:010563762:mpeg21:p001:a0005" 
pm:id="ddd:010563762:mpeg21:p001:a0005"> 
<title pm:id="ddd:010563762:mpeg21:p001:a0005.t">De jongste maaregelen op den Rechter- 
Rijn-oeven.</title> 
<text> 
<p pm:id="ddd:010563762:mpeg21:p001:a0005.1">â– volgende redenen rijn bezet: lo. ter vereenvcudi-f 
ging ran het douane-wezen en 2o. wegens fit' demonstratie» en vergaderingen, welke in de»e gebieden 
zijn gehouden en gericht waren tegen de bezettingstroepen en de bezettingsautoriteiten. De 
rijkscommissaris voor de bezette genie den heeft geweigerd, deze kennisgevins door te zenden. — 
(Wolft},</p> 
</text> 
</pm:content> 
</pm:root> 
</pm:KBroot> 

Daraus möchte ich aus dem dc:date-Tag, das Datum erhalten, das Thema aus th dc:subject Tag, den Titel aus dem title Tag und der Text aus dem Tag text für jeden Artikel im Tag pm:KBroot. Was ich bisher habe, ist die folgende:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(open("telegraaf-1923.xml", "r"), "xml") 

all_articles = [] 

for article in soup.find_all("root"): 
    new_article = { 
     "date": article.date.string, 
     "subject": article.subject.string, 
     "title": article.content.title.string, 
     "body": article.content.text 
    } 

    all_articles.append(new_article) 

die folgenden für den oben genannten Artikel ergibt sich:

{ 
    "date": "1923-03-01", 
    "body": "De jongste maaregelen op den Rechter- Rijn-oeven.\u25a0 volgende redenen rijn bezet: lo. ter vereenvcudi-f ging ran het douane-wezen en 2o. wegens fit' demonstratie\u00bb en vergaderingen, welke in de\u00bbe gebieden zijn gehouden en gericht waren tegen de bezettingstroepen en de bezettingsautoriteiten. De rijkscommissaris voor de bezette genie den heeft geweigerd, deze kennisgevins door te zenden. \u2014 (Wolft},", 
    "title": "De jongste maaregelen op den Rechter- Rijn-oeven.", 
    "subject": "artikel" 
} 

Wie Sie sehen können, ist das Problem den Titel und den Körper des Artikels zu trennen , da sie beide text Tags haben, und so enthält body sowohl den Titel als auch den Hauptteil des Artikels. Ich habe versucht, "body": article.content.text.p, aber das gibt AttributeError: 'unicode' object has no attribute 'p'.

+0

'verwenden Text hat in BS eine besondere Bedeutung. Es ist wie die Funktion 'get_text()' oder 'string' in Ihrem Code - also versuchen Sie es mit' article.content.p.string' oder mit 'find ('text')' – furas

Antwort

1

text hat besondere Bedeutung in BS. Es ist wie string in Sie Code (oder Funktion get_text())

So article.content.text bedeutet article.content.string oder article.content.get_text()

Aber Sie können

article.content.p.string 

oder haben Sie verwenden find('text')

article.content.find('text').p.string 
+0

Ich habe bereits einen anderen Weg gefunden Mach es, aber jetzt habe ich Probleme damit, den 'pm: source' Inhalt zu bekommen, also wenn du mir dabei helfen könntest, würde ich es sehr schätzen. – user5368737

+1

das funktioniert für mich 'article.content.attrs ['pm: source']' oder sogar 'article.content ['pm: source']' ' – furas