【问题标题】:Parsing XML with BeautifulSoup用 BeautifulSoup 解析 XML
【发布时间】: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


【解决方案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

【讨论】:

  • 我已经想出了另一种方法,但现在我正在努力获取pm:source 内容,所以如果你能提供帮助,我将非常感激。跨度>
  • 这对我有用 article.content.attrs['pm:source'] 甚至 article.content['pm:source']
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 2021-12-16
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多