2016-10-24 156 views
0

我試圖解析一個XML文件,它充滿了來自報紙的文章,將其保存爲JSON格式,將其保存爲列表,然後使用elasticsearch對其進行批量索引。從每篇文章中,我想知道它的發佈日期,文章類型(廣告,正常文章等)及其標題和內容。我遇到的問題是,我無法將文章的標題與其內容分開。用BeautifulSoup解析XML

的文章之一的示例如下所示:

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

由此,我想從dc:date標籤的日期,從日dc:subject標籤,標題從title標籤和主題來自text標籤的文字,用於標籤pm:KBroot中的每篇文章。我至今如下:

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) 

導致了上述文章如下:

{ 
    "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" 
} 

正如你所看到的,問題是分離的標題和文章正文,因爲它們都有text標籤,所以body包含文章的標題和正文。我嘗試使用"body": article.content.text.p,但這給了AttributeError: 'unicode' object has no attribute 'p'

+0

'文本「在BS中有特殊的含義。它就像函數'get_text()'或'string'在你的代碼 - 所以也許嘗試'article.content.p.string'或者你必須使用'find('text')' – furas

回答

1

text在BS有特殊意義。這就像string在你的代碼(或功能get_text()

所以article.content.text意味着article.content.stringarticle.content.get_text()

但是你可以使用

article.content.p.string 

,或者你必須使用find('text')

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

我已經想出了另一種方式做到這一點,但現在我正在努力如何獲得'pm:source'內容,所以如果你能提供幫助,我會非常感激。 – user5368737

+1

這對我有用'article.content.attrs ['pm:source']'甚至'article.content ['pm:source']' – furas