我有一个hmtl文件,如下所示:
...
<!-- Special_ID -->
<p> stuff1 </p>
<p> stuff2 </p>
<!-- /Special_ID -->
...
我有一个INI文件:
[general]
param=stuff1
stuff2
如果用户编辑文件并将param
值更改为test
,我希望将html文件更改为:
...
<!-- Special_ID -->
<p> test </p>
<!-- /Special_ID -->
...
目前,我正在做的是解析INI文件(Python的ConfigParser
),然后将部分(“general”)和选项(“param”)转换为一个开始和停止特殊ID,就像在上面的例子。
然后:
while we haven't found the start id:
just write a line to some temporary file
write our start id to the temp file
write out new value ("test") to the temp file # surround with <p>
loop through original file until we find the stop id
then write the stop id and the rest of the file to temp
replace original file with tmp file
有更聪明的方法吗?
也许是已经完成此操作的Python模块。
我也不是特别喜欢要求<!-- Special_ID -->
,但我没有使用网页框架(只是一个简单的应用程序),所以我不能只是做一个花哨的<p py:for ...>...
喜欢TurboGears中。
答案 0 :(得分:1)
总体上不确定您提供的当前方法,但以下是如何在特定注释后替换所有p
元素并改为插入新的p
元素(使用{{1 HTML解析器)。我的想法是:
BeautifulSoup
sibling elements .extract()
p
元素
.insert_after()
在评论p
元素
工作代码:
p
打印:
from bs4 import BeautifulSoup, Comment
data = """
<!-- Special_ID -->
<p> stuff1 </p>
<p> stuff2 </p>
<!-- /Special_ID -->
"""
soup = BeautifulSoup(data, "html.parser")
# find "Special_ID" comment
special_id = soup.find(text=lambda text: isinstance(text, Comment) and "Special_ID" in text)
# find all sibling "p" elements
for p in special_id.find_next_siblings("p"):
p.extract()
# create new "p" element
tag = soup.new_tag("p")
tag.string = "test"
# insert the new "p" element after the comment
special_id.insert_after(tag)
print(soup.prettify())