【发布时间】:2014-03-18 14:36:24
【问题描述】:
我有 SVG 和 html 文件,其中有几个 java 脚本标签,我需要找到所有脚本标签并在第一个脚本标签之前和最后一个脚本标签之后插入注释。我正在尝试使用 Beautifulsoup 来实现它。它适用于 HTML 版本,但对于 SVG,它会抛出错误。
//for html version of file, working as expected
soup = BeautifulSoup(data,selfClosingTags=['link','meta'])
for num,tag in enumerate(soup.findAll('script')):
if num==0:
soup.head.insert(-1,startcomment)
tag.extract()
soup.head.insert(len(-1,tag)
if num==len(soup.findAll('script'))-1:
soup.head.insert(-1,endcomment)
但是现在,当我尝试在第一行中实现与 soup = BeautifulSoup(data,"xml") 相同的 svg 时,它会引发异常.. svg 也是 xml?所以我应该可以这样做
更新 - SVG 格式
<?xml version="1.0"?>
<?xml-stylesheet href="../../../some.css" type="text/css"?>
<svg id="mycontent" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" focusable="true" onload="Jsfunction.load()">
<script xlink:href="../first.js" />
<script xlink:href="../second.js" />
<script xlink:href="../third.js" />
</svg>
应该改为
<?xml version="1.0"?>
<?xml-stylesheet href="../../../some.css" type="text/css"?>
<svg id="mycontent" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" focusable="true" onload="Jsfunction.load()">
<!-- some comment -->
<script xlink:href="../first.js" />
<script xlink:href="../second.js" />
<script xlink:href="../third.js" />
<!-- end comment -->
</svg>
【问题讨论】:
-
它会抛出什么异常?您使用的是哪个版本的 BeautifulSoup?
-
BS 版本 3.2.1,例外是与 str 和 bool 值有关的东西,我认为这是由于 svg 额外的参数。我现在没有office系统,所以不能准确,明天更新。但是我想为所有脚本标签读取这个xml并在之前和之后输入cmets......所有脚本标签将一个接一个
-
BeautifulSoup 3 开发多年前已停止,您真的想改用 BeautifulSoup 4(安装
lxml来处理此处的 XML 解析)。 -
是的,我有 lxml 并且可以升级 BS4(如果它支持 python 2.7.x)
-
支持python 2.7,是的。
标签: python xml python-2.7 xml-parsing beautifulsoup