使用python的beautifulsoup读取xml配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python的beautifulsoup读取xml配置文件相关的知识,希望对你有一定的参考价值。

我想写一个xml文件作为配置文件:
<settings>
<dd key="d1" value="大一"/>
<dd key="d2" value="大二"/>
<dd key="d3" value="大三"/>
</settings>
我想通过解析读取key的值(比如"d1")得到value 的内容,求解怎么用python的beautifulsoup实现??

beautifulsoup分析html非常方便,但xml却不怎么样

推荐使用自带的xml的etree分析

import xml.etree.ElementTree as ET
root = ET.fromstring('''<settings><dd key="d1" value="大一"/><dd key="d2" value="大二"/><dd key="d3" value="大三"/></settings>''')
root[0].items()

追问

还真是,教程都是说html的·
话说,我要是想实现更方便的切换,这个xml应该怎么写更适合更改配置呢?

追答>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>

etree提供了方便的输出xml的方法


Element.text()

Element.write()

Element.set()

...

这些方法可以修改,再dump出来

参考技术A # coding:utf8
from BeautifulSoup import BeautifulSoup
axml = '''<settings>
<dd key="d1" value="大一"/>
<dd key="d2" value="大二"/>
<dd key="d3" value="大三"/>
</settings>'''
soup = BeautifulSoup(axml)
for s in soup.findAll('dd','key':"d1"):
print s.get('value').encode('utf8')

运行结果:

大一

[Finished in 0.1s]

Python3.x的BeautifulSoup解析html常用函数

Python3.x的BeautifulSoup解析html常用函数

1,初始化:

soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == str

2,用tag获取相应代码块的剖析树:

#当用tag作为搜索条件时,我们获取的包含这个tag块的剖析树:
#<tag><xxx>ooo</xxx></tag>
#这里获取head这个块
head = soup.find(head)
# or
# head = soup.head
# or
# head = soup.contents[0].contents[0]

contents属性是一个列表,里面保存了该剖析树的直接儿子,如:

html = soup.contents[0] # <html> ... </html>
head = html.contents[0] # <head> ... </head>
body = html.contents[1] # <body> ... </body>

3,用contents[], parent, nextSibling, previousSibling寻找父子兄弟tag:

  beautifulSoup提供了几个简单的方法直接获取当前tag块的父子兄弟。

 假设我们已经获得了body这个tag块,我们想要寻找<html>, <head>, 第一个<p>, 第二个<p>这四个tag块:

# body = soup.bodyhtml = body.parent # html是body的父亲
head = body.previousSibling # head和body在同一层,是body的前一个兄弟
p1 = body.contents[0] # p1, p2都是body的儿子,我们用contents[0]取得p1
p2 = p1.nextSibling # p2与p1在同一层,是p1的后一个兄弟, 当然body.content[1]也可得到

print(p1.text)
# u‘This is paragraphone.‘
print(p2.text)
# u‘This is paragraphtwo.‘
#  注意:1,每个tag的text包括了它以及它子孙的text。2,所有text已经被自动转
#为unicode,如果需要,可以自行转码encode(xxx)

4,用find, findParent, findNextSibling, findPreviousSibling寻找祖先或者子孙 tag:

  find方法(我理解和findChild是一样的),就是以当前节点为起始,遍历整个子树,找到后返回。

 而这些方法的复数形式,会找到所有符合要求的tag,以list的方式放回。他们的对应关系是:find->findall, findParent->findParents, findNextSibling->findNextSiblings...,如:

print soup.findAll(p)
# [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>, <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>]

5,find的几种用法,其他的类比: find(name=None, attrs={}, recursive=True, text=None, **kwargs),文档参考:          https://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#The%20basic%20find%20method:%20findAll%28name,%20attrs,%20recursive,%20text,%20limit,%20**kwargs%29)

 

 (1).搜索tag:

find(tagname)        # 直接搜索名为tagname的tag 如:find(‘head‘)
find(list)           # 搜索在list中的tag,如: find([‘head‘, ‘body‘])
find(dict)           # 搜索在dict中的tag,如:find({‘head‘:True, ‘body‘:True})
find(re.compile(‘‘)) # 搜索符合正则的tag, 如:find(re.compile(‘^p‘)) 搜索以p开头的tag
find(lambda)         # 搜索函数返回结果为true的tag, 如:find(lambda name: if len(name) == 1) 搜索长度为1的tag
find(True)           # 搜索所有tag

 (2),搜索属性(attrs):

find(id=xxx)                                  # 寻找id属性为xxx的
find(attrs={id=re.compile(xxx), algin=xxx}) # 寻找id属性符合正则且algin属性为xxx的
find(attrs={id=True, algin=None})               # 寻找有id属性但是没有algin属性的

 (3),搜索文字(text):

           注意:文字的搜索会导致其他搜索给的值如:tag, attrs都失效。

                方法与搜索tag一致;

 (4),recursive, limit:

      recursive=False表示只搜索直接儿子,否则搜索整个子树,默认为True。

     当使用findAll或者类似返回list的方法时,limit属性用于限制返回的数量,如findAll(‘p‘, limit=2): 返回首先找到的两个tag

 

以上是关于使用python的beautifulsoup读取xml配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Python3.x:BeautifulSoup()解决中文乱码问题

Python3.x:BeautifulSoup()解析网页内容出现乱码

Python3.x的BeautifulSoup解析html常用函数

Python:使用 BeautifulSoup 库抓取百度天气

使用 urllib 和 BeautifulSoup 通过 Python 从 Web 检索信息

《Python网络数据采集》笔记之BeautifulSoup