Python:如果XML标签不存在,我需要打印'Blank'和Output

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (90)

忽略下面的文本段落

XML代码是万维网联盟(W3C)的正式推荐,类似于超文本标记语言(HTML)。XML和HTML都包含用于描述页面或文件内容的标记符号。HTML代码仅描述网页内容(主要是文本和图形图像)的显示方式和交互方式。

XML数据被称为自描述或自定义,意味着数据的结构嵌入了数据,因此当数据到达时,不需要预先构建存储数据的结构; 它在XML中被动态理解。XML格式可供希望以一致方式共享信息的任何个人或个人或公司组使用。XML实际上是标准通用标记语言(SGML)的一个更简单且更易于使用的子集,它是创建文档结构的标准。

这是我的XML文件:

<CI_INFO>
  <CI_JOURNAL>
    <CI_AUTHOR>CAMPBELL D</CI_AUTHOR>
    <CI_VOLUME>0079</CI_VOLUME>
    <CI_PAGE>00034</CI_PAGE>
    <CI_YEAR>2013</CI_YEAR>
    <CI_TITLE> <![CDATA[ ALASKA MAGAZINE FEB ]]></CI_TITLE>
  </CI_JOURNAL>
</CI_INFO>

上面的XML文件是正确的格式,提供了我期望的所有信息(即CI_AUTHOR,CI_VOLUME,CI_PAGE,_CI_YEAR,CI_TITLE)

但是,如果您看到以下示例,则CI_VOLUME,CI_PAGE标记不存在

<CI_INFO>
  <CI_JOURNAL>
    <CI_AUTHOR>BURKE CH</CI_AUTHOR>
    <CI_YEAR>1961</CI_YEAR>
    <CI_TITLE> <![CDATA[ DOCTOR HAP ]]> </CI_TITLE>
  </CI_JOURNAL>
</CI_INFO>

对于下面一个CI_AUTHORCI_VOLUMECI_PAGE标签是不存在的。

<CI_INFO>
  <CI_JOURNAL>
    <CI_YEAR>1905</CI_YEAR>
    <CI_TITLE> <![CDATA[ REPORT GOVERNOR ALAS ]]></CI_TITLE>
  </CI_JOURNAL>
</CI_INFO>

所以,因为我使用下面的代码来提取所有5个字段。

import requests
from bs4 import BeautifulSoup
import lxml

soup = BeautifulSoup(contents,'lxml') 

author=[v.get_text() for v in soup.select('ci_author')]
vol=[v.get_text() for v in soup.select('ci_volume')]
page=[v.get_text() for v in soup.select('ci_page')]
year=[v.get_text() for v in soup.select('ci_year')]
title=[v.get_text() for v in soup.select('ci_title')]
print (author)
print (vol)
print (page)
print (year)
print (title)

如果标签不存在,我需要下面的解决方案,我需要打印'空白'和输出。例如,让我们看一下上面的第3个XML示例

>   ['Blank']
    ['Blank']
    ['Blank']
    ['1905']
    ['REPORT GOVERNOR ALAS']

这是我的第二个例子。在此示例中,错过了两个标签ci_volume和ci_page。在这里我想打印'空白'的标签不存在于那个xml中

>   ['BURKE CH'] 
    ['Blank'] 
    ['Blank']
    ['1961'] 
    ['DOCTOR HAP']

这是我的第一个例子。在此示例中,将显示所有5个预期标记。因此,输出打印所有5个标签文本。

>   ['CAMPBELL D']
    ['0079']
    ['00034']
    ['2013']
    ['ALASKA MAGAZINE FEB']  

如果有人为此提供解决方案对我进一步使用该XML文件将非常有帮助。我很期待你

提问于
用户回答回答于

您可以尝试这样的事情:创建一个生成器,它将从存储在字典中的XML文件中产生值。XML文件中缺少的值将在此字典中存储为“Blank”:

from bs4 import BeautifulSoup

data = """<CI_INFO>
  <CI_JOURNAL>
    <CI_AUTHOR>CAMPBELL D</CI_AUTHOR>
    <CI_VOLUME>0079</CI_VOLUME>
    <CI_PAGE>00034</CI_PAGE>
    <CI_YEAR>2013</CI_YEAR>
    <CI_TITLE> <![CDATA[ ALASKA MAGAZINE FEB ]]></CI_TITLE>
  </CI_JOURNAL>

  <CI_JOURNAL>
    <CI_AUTHOR>BURKE CH</CI_AUTHOR>
    <CI_YEAR>1961</CI_YEAR>
    <CI_TITLE> <![CDATA[ DOCTOR HAP ]]> </CI_TITLE>
  </CI_JOURNAL>


  <CI_JOURNAL>
    <CI_YEAR>1905</CI_YEAR>
    <CI_TITLE> <![CDATA[ REPORT GOVERNOR ALAS ]]></CI_TITLE>
  </CI_JOURNAL>
</CI_INFO>"""


def parse_data(soup):
    _text = lambda soup, name: soup.find(name).text.strip() if soup.find(name) else 'Blank'
    for j in soup.select('CI_JOURNAL'):
        d = {}
        d['author'] = _text(j, 'CI_AUTHOR')
        d['vol'] = _text(j, 'CI_VOLUME')
        d['page'] = _text(j, 'CI_PAGE')
        d['year'] = _text(j, 'CI_YEAR')
        d['title'] = _text(j, 'CI_TITLE')
        yield d

for info in parse_data(BeautifulSoup(data, 'xml')):
    print(info['author'])
    print(info['vol'])
    print(info['page'])
    print(info['year'])
    print(info['title'])
    print('-' * 80)

这将打印:

CAMPBELL D
0079
00034
2013
ALASKA MAGAZINE FEB
--------------------------------------------------------------------------------
BURKE CH
Blank
Blank
1961
DOCTOR HAP
--------------------------------------------------------------------------------
Blank
Blank
Blank
1905
REPORT GOVERNOR ALAS
--------------------------------------------------------------------------------

扫码关注云+社区

领取腾讯云代金券