首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:如果XML标记不存在,我需要输出'Blank‘

Python:如果XML标记不存在,我需要输出'Blank‘
EN

Stack Overflow用户
提问于 2018-08-03 02:31:20
回答 1查看 95关注 0票数 0

忽略下面的文本段落

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

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

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

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
import lxml

soup = BeautifulSoup(contents,'lxml') 

a=[v.get_text() for v in soup.select('cia')]
v=[v.get_text() for v in soup.select('civ')]
p=[v.get_text() for v in soup.select('cip')]
y=[v.get_text() for v in soup.select('ciy')]
t=[v.get_text() for v in soup.select('cit')]
print (a)
print (v)
print (p)
print (y)
print (t)
EN

回答 1

Stack Overflow用户

发布于 2018-08-03 04:36:07

您可以尝试这样做:制作一个生成器,它将从存储在字典中的XML文件中生成值。XML文件中缺少的值将在此字典中存储为'Blank‘:

代码语言:javascript
复制
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)

这将打印以下内容:

代码语言:javascript
复制
CAMPBELL D
0079
00034
2013
ALASKA MAGAZINE FEB
--------------------------------------------------------------------------------
BURKE CH
Blank
Blank
1961
DOCTOR HAP
--------------------------------------------------------------------------------
Blank
Blank
Blank
1905
REPORT GOVERNOR ALAS
--------------------------------------------------------------------------------

编辑:

如果您想要分隔列,可以这样做:

代码语言:javascript
复制
author, vol, page, year, title = [], [], [], [], []
for d in parse_data(BeautifulSoup(data, 'xml')):
    author.append(d['author'])
    vol.append(d['vol'])
    page.append(d['page'])
    year.append(d['year'])
    title.append(d['title'])

print(author)
print(vol)
print(page)
print(year)
print(title)

这将打印:

代码语言:javascript
复制
['CAMPBELL D', 'BURKE CH', 'Blank']
['0079', 'Blank', 'Blank']
['00034', 'Blank', 'Blank']
['2013', '1961', '1905']
['ALASKA MAGAZINE FEB', 'DOCTOR HAP', 'REPORT GOVERNOR ALAS']

编辑:

要使用'\t'打印,可以使用以下代码:

代码语言:javascript
复制
print('>\t' + str(author))
print('\t' + str(vol))
print('\t' + str(page))
print('\t' + str(year))
print('\t' + str(title))

这将打印以下内容:

代码语言:javascript
复制
>   ['CAMPBELL D', 'BURKE CH', 'Blank']
    ['0079', 'Blank', 'Blank']
    ['00034', 'Blank', 'Blank']
    ['2013', '1961', '1905']
    ['ALASKA MAGAZINE FEB', 'DOCTOR HAP', 'REPORT GOVERNOR ALAS']
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51660134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档