【发布时间】:2016-10-24 12:23:35
【问题描述】:
我正在尝试解析一个包含报纸文章的 XML 文件,将其保存为 JSON 格式,将其保存到列表中,然后使用 elasticsearch 对其进行批量索引。从每篇文章中,我想获取它的发布日期、文章类型(广告、普通文章等)及其标题和内容。我遇到的问题是我无法将文章的标题与其内容分开。
此处显示了其中一篇文章的示例:
<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'。
【问题讨论】:
-
text在 BS 中有特殊的含义。它就像你代码中的函数get_text()或string- 所以也许试试article.content.p.string或者你必须使用find('text')
标签: python json xml elasticsearch