查看原文
其他

如何用Python获取知乎头条精选| XML处理实战运用

xinxin 菜鸟学Python 2020-11-17

这是菜鸟学Python的第72篇原创文章

阅读本文大概需要5分钟


        Python常见的数据文件,我们前面已经讲了2种CSV,JSON (不知道的小伙伴可以回头翻阅一下历史文章近20年五粮液股价分析|CSV文件实战处理用Python写个迷你出门问问|10几行代码搞定).现在讲第3种XML文件,XML语言是一个较老的结构化数据格式,它是可扩展标记语言,用于标记电子文件使其具有结构性的标记语言,XML 被设计用来结构化、存储以及传输信息。

      其实XML很早就诞生了(那时我还没有上高中呢),XML使用范围非常广,比JSON应用的更广,今天我们就来讲讲Python如何处理XML文件,最后用一个小例子实战获取知乎头条精选



要点:

  • XML有哪些特质

  • 如何生成XML

  • 字典如何转XML

  • 实战获取知乎每日精选


1.XML有哪些特质

比如下面这样一个简单的xml:

<?xml version = "1.0" encoding = "utf-8"?>

<data>

    <people name="jack">

        <age>30</age>

        <sex>male</sex>

    </people>

</data>


1).第一行是 XML 声明

它定义 XML 的版本(1.0)和所使用的编码(utf-8 : 万国码, 可显示各种语言)


2).必须包含根元素(有且只有一个)

该元素是所有其他元素的父元素,这里的根元素是Data

<Data>

..

</Data>

所有的<people>都被包含在<Data>里面


3).元素开始标签必须要有结束标签

<people> 元素有 2个子元素:<age>、<sex>

每个元素都有对应的关闭标签(跟HTML不一样,有一些是不需要关闭的,比如<p>,<br>)


4).XML 标签对大小写敏感

比如<Data>和<DATA>是不一样的 


5).XML 属性值必须加引号

<people name=jack>这样会报错的,必须"jack"才行


一般来说Python里对XML文档的处理,常用的模块有ElementTree,第三方的神器lxml,今天我们主要介绍ElementTree模块的使用



2.如何生成一个XML文件

比如要生成如下的XML的数据结构

<?xml version = "1.0" encoding = "utf-8"?>

<data>

    <people name="jack">

        <age>30</age>

        <sex>male</sex>

    </people>

</data>

其实这个不难,分如下几步就可以


1).引入几个重要模块Element,ElementTree,tostring

from xml.etree.ElementTree import Element,ElementTree,tostring


2).先创建根节点

root=Element('Data')

print tostring(root)

>>

<Data />

tostring模块可以把xml数据方便的转成str,然后打印出来,比较直观


3).再创建子节点people,并设置它的属性

node=Element('people')

node.set('name','jack')

print tostring(node)

>>

<people name="jack" />


4).再创建子节点里面的两个孙节点

sub_node=Element('age')

sub_node.text='30'


sub_node2=Element('sex')

sub_node2.text='male'

  • 这两个Element都只有内容,没有属性.

  • 而且数字30一定要写成字符串,不能是数字


5).把所有的Element串起来

node.append(sub_node)

node.append(sub_node2)

root.append(node)

print tostring(root)

>>

<Data><people name="jack"><age>30</age><sex>male</sex></people></Data>


6).生成XML文件

et=ElementTree(root)

et.write("demo.xml")

>>

<Data><people name="jack"><age>30</age><sex>male</sex></people></Data>


root是一个大的节点,里面套了很多子节点,子节点又有很多孙节点,现在我们用ElementTree把它生成一个ElementTree的对象,然后生成xml文件.但是这个文件里的xml没有格式化过,非常丑,我们美化一下


7).美化打印


toprettyxml函数里面的第一个参数,其实就是缩进空格的数量,我们这边填了4个空格,美观输出的时候就可以看到缩了4个空格


思考题:美观只能打印显示,如何把demo.xml文件里面的数据也美观一下并写入一个新的xml文件



3.如何把字典转换成XML

比如我们有一个字典d1={'name':'leo','age':30,'sex':'male'}

如何生成一个xml格式的数据呢,其实也是用到了Element,原理查不多,我们看代码:

>>

<Data><age>30</age><name>leo</name><sex>male</sex></Data>


是不是原理和前面一个例子差不多,尤其要注意的是str(value),一定要把内容的值str化.



实战获取知乎每日精选

知乎的每日精选上有大量好玩有趣的文章,其实它是一个rss订阅(rss也叫聚合内容,是使用最广泛的XML应用)里面数据都是标准的XML格式,下面我的小程序就来获取并处理这些数据


1).用urllib2获取知乎上的每日精选

2).用parse模板把rss上的xml数据转成ElementTree对象

3).搜索xml里面的主节点channel下面的所有item内容

4).找到title和link,存入top_news列表里面

5).把内容写到文件中,注意win下encode用gbk解析,linux/mac下encode需要用utf-8


看一下输出:



Python做个知乎日报精选就讲到这里,是不是觉得蛮好玩的,今天的文章希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.


ZZS

优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。

扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!





欢迎大家关注 菜鸟学Python",更多好玩有趣的Python原创教程,趣味算法,经验技巧,行业动态,尽在菜鸟学Python,一起来学python吧


历史人气文章

Python语言如何入门

同学,学Python真的不能这样学

用Python写个弹球的游戏

Python写个迷你聊天机器人|生成器的高级用法

用Python破解微软面试题|24点游戏

2道极好的Python算法题|带你透彻理解装饰器的妙用

一道Google的算法题 |Python巧妙破解


 长按二维码,关注【菜鸟学python】



来源 | 菜鸟学Python

作者 | xinxin

本文章为菜鸟学Python独家原创稿件,未经授权不得转载






    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存