由于和html打交道有一段时间了,对html网页的分析,我比较习惯使用bs4来做分析。
今天接触到一个 xml 格式的文件,打算自动处理了,以前我也使用过bs4,当时没有发现弊端。
- xml 标签有命名空间
- xml 标签和属性是区分大小写的
- xml 不包含html 。 html中包含 html标签
这和html 的标签分析是不一样的,bs4 有弊端。
对于第一个, xml 有命名空间的问题, bs4 的 lxml 解析模式, 可以将命名空间当成标签的一部分来做解释。
如下:
import bs4
bsp = bs4.BeautifulSoup('<abc><a:bc>abc</a:bc></abc>', features='lxml')
print(bsp.findall('a\:bc'))
这样就可以将对应的标签找出来,注意这里分析是按照 html 来做的,不区分大小写。
在保存的时候,如果只是想分析一下xml文件,这种方法也还行。
但是想修改的话,bs4就完全沦陷了。
第一个就是bs4会默认添加html-head-body标签格式,这个我使用节点解析的方式,在body节点下找到原先的root节点,对原先的root节点进行保存还是可以解决的。
第二个沦陷的地方就是保存的标签默认全是小写, 大小写被忽略了。
这个保存的xml和原先的xml在xml的语法是两个意思。
最后发现,这条路是完全走不通的。
然后我找到了 python中的 xml.etree.ElementTree, 这个才是正解。对原先的bs4代码进行替换,问题才算解决,继续结下来的工作 … <|-_-|>
参考