【问题标题】:Create JSON with XML file using BeautifulSoup使用 BeautifulSoup 创建带有 XML 文件的 JSON
【发布时间】:2018-11-10 09:35:28
【问题描述】:

我正在使用 Jupyer 笔记本,运行 python 3。我的任务是从 XML 文件中提取数据并将其转换为 json 格式(甚至可能将 json 保存在 output.dat 文件中)。我正在使用 BeautifulSoup 浏览节点。我有以下数据:

<?xml version='1.0' encoding='UTF-8'?> 
<Terms>   
 <Term>
    <Title>.177 (4.5mm) Airgun</Title>
    <Description>The standard airgun calibre for international target 
                 shooting.</Description>
    <RelatedTerms>
      <Term>
        <Title>Shooting sport equipment</Title>
        <Relationship>Narrower Term</Relationship>
      </Term>
    </RelatedTerms>   
 </Term>
 <Term>
    <Title>1 Kilometre Time Trial</Title>
    <Description>test2</Description>
    <RelatedTerms>
    <Term>
      <Title>1 Kilometre TT</Title>
      <Relationship>Used For</Relationship>
    </Term>
    <Term>
      <Title>1km Time Trial</Title>
    <Relationship>Used For</Relationship>
  </Term>
  <Term>
    <Title>1km Time Trial</Title>
    <Relationship>Used For</Relationship>
  </Term>
  <Term>
    <Title>1km TT</Title>
    <Relationship>Used For</Relationship>
  </Term>
  <Term>
    <Title>One km Time Trial</Title>
    <Relationship>Used For</Relationship>
  </Term>
</RelatedTerms>
</Term>

这是我在 JSON 中所期望的以下输出:

{
"thesaurus": [
{
"Description": "The standard airgun calibre for international target shooting.",
"RelatedTerms": [
{
"Relationship": "Narrower Term",
"Title": "Shooting sport equipment"
}
],
"Title": ".177 (4.5mm) Airgun"
}, 

{
"Description": "test2",
"RelatedTerms": [
{
"Relationship": "Used For",
"Title": "1 Kilometre TT"
},
{
"Relationship": "Used For",
"Title": "1km Time Trial"
},
{
"Relationship": "Used For",
"Title": "1km Time Trial"
},
{
"Relationship": "Used For",
"Title": "1km TT"
},
{
"Relationship": "Used For",
"Title": "One km Time Trial"
}
],
"Title": "1 Kilometre Time Trial"
},

我正在浏览标签,以便创建字典,如输出示例中所示。由于我是文本抓取的新手,这非常令人沮丧。

我能够使用以下代码提取“描述”标签:

xml_file = './xml.xml'
btree = BeautifulSoup(open(xml_file, encoding="utf8"),"xml")
elements = btree.find_all('Description')
descriptionTag = []
for element in elements:
    descriptionTag.append(element.text) 

与上面的描述标签一样,我不确定如何为存储在“RelatedTerms”标签之间的信息创建一个字典列表。 理想情况下,我会将所有标签解析为数据帧,然后将数据转换为 JSON 格式。

那么,请有人帮忙确定如何从“RelatedTerms”标签中提取信息。

【问题讨论】:

    标签: json xml beautifulsoup


    【解决方案1】:

    要提取RelatedTerms,首先你必须使用btree.select('Terms &gt; Term')提取顶部Term元素,现在你可以循环它并使用RelatedTermsRelatedTerms中提取Termterm.select('RelatedTerms &gt; Term')

    import json
    from bs4 import BeautifulSoup
    
    xml_file = './xml.xml'
    btree = BeautifulSoup(open(xml_file, 'r'), "xml")
    Terms = btree.select('Terms > Term')
    jsonObj = {"thesaurus": []}
    
    for term in Terms:
        termDetail = {
            "Description": term.find('Description').text,
            "Title": term.find('Title').text
        }
        RelatedTerms = term.select('RelatedTerms > Term')
        if RelatedTerms:
            termDetail["RelatedTerms"] = []
            for rterm in RelatedTerms:
                termDetail["RelatedTerms"].append({
                    "Title": rterm.find('Title').text,
                    "Relationship": rterm.find('Relationship').text
                })
        jsonObj["thesaurus"].append(termDetail)
    
    print json.dumps(jsonObj, indent=4)
    

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多