2016-10-24 2 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 태그에서 제목과 일에서 피사체를 얻으려면 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

사용해야합니다 텍스트 '는 BS에서 특별한 의미를 갖는다. 코드에서 함수'get_text()'또는'string'과 비슷합니다. 아마도'article.content.p.string'을 시도하거나'find ('text')'를 사용해야합니다. – furas

답변

1

text은 BS에서 특별한 의미가 있습니다. `그것은 당신의 코드 (또는 함수 get_text())

그래서 article.content.textarticle.content.string 또는

article.content.get_text()을 의미하지만

article.content.p.string 

을 사용할 수 있습니다에 string 비슷하거나 find('text')

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

이미 다른 방법을 알아 냈습니다. 하지만 이제는'pm : source' 콘텐츠를 얻는 방법을 고민하고 있습니다. 도움을 주시면 감사하겠습니다. – user5368737

+1

이 기사는'article.content.attrs [ 'pm : source']'또는'article.content [ 'pm : source']' – furas

관련 문제