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'
.
'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