2016-10-24 26 views
0

新聞の記事が満載のXMLファイルを解析し、JSON形式で保存し、リストに保存してから、elasticsearchで一括してインデックスを作成しようとしています。各記事から、出版された日付、記事のタイプ(広告、通常の記事など)、タイトルとコンテンツを取得したいと思います。私がこれを持っている問題は、記事のタイトルとその内容を分けることができないということです。BeautifulSoupを使用したXMLの解析

記事の1の例を次に示します。このことから

<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タグからタイトルから日付を取得したいとpm:KBrootの各記事のtextタグのテキスト。私はこれまで、次のされています

上記の記事のために、以下になり
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

を使用する必要が

あなたのコード(または機能get_text())でstringのようなものですテキストはBSにおいて特別な意味を有する。あなたのコードでは 'get_text()'や 'string'のようなものです。' article.content.p.string'を試してみるか、 'find( 'text')'を使う必要があります。 – furas

答えて

1

textは、BSでは特別な意味を持ちます。それはとても `article.content.textarticle.content.stringまたはarticle.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