gpt4 book ai didi

Python:BeautifulSoup修改文本

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:45 27 4
gpt4 key购买 nike

我需要对大量 XHTML 文件进行后期处理,但这些文件不是我生成的,因此我无法修复生成它的代码。我无法使用正则表达式来删除整个文件,只能删除高度选择性的文件,因为有些链接和 ID 的数字是我无法全局更改的。

我已经大大简化了这个示例,因为原始文件具有 RTL 文本。我只对修改可见文本中的数字感兴趣,而不是标记。似乎有 3 种不同的情况。

bk1.xhtml 的片段:

案例 1:与链接交叉引用,数字 xt 与嵌入的书目引用文本

<aside epub:type='footnote' id="FN96"><p class="x"><a class="notebackref" href="#bk1_21_9"><span class="notemark">*</span>text</a>
<span class="xt"> <a class='bookref' href='bk50.xhtml#bk50_118_26'>some text with these digits: 26:118</a></span></p></aside>

情况 2:没有链接的交叉引用 - xt 中有数字,没有嵌入的书目引用文本

<aside epub:type='footnote' id="FN100"><p class="x"><a class="notebackref" href="#bk1_21_42"><span class="notemark">*</span>text</a>
<span class="xt">some text with these digits: 26:118</span></p></aside>

情况 3:脚注没有链接,但脚注文本中有数字

<aside epub:type='footnote' id="FN107"><p class="f"><a class="notebackref" href="#bk1_22_44"><span class="notemark">§</span>text</a>
<span class="ft">some text with these digits: 22</span></p></aside>

我正在尝试找出如何识别可见用户部分内的文本字符串,以便我可以仅修改相关数字:

情况 1:我需要捕获 <a class='bookref' href='bk1.xhtml#bk1_118_26'>some text 26:118</a>将“some text 26:118”子字符串分配给变量并针对该变量运行正则表达式;然后将该子字符串替换回原来的文件中。

案例 2:我只需要捕获 <span class="xt">some text 26:118</span>并仅更改“some text 26:118”子字符串中的数字并针对该变量运行正则表达式;然后将该子字符串替换回原来的文件中。

案例 3:我只需要捕获 <span class="ft">some text 22</span>并仅更改“some text 22”子字符串中的数字并针对该变量运行正则表达式;然后将该子字符串替换回原来的文件中。

我有数千个这样的任务需要在很多文件中完成。我知道如何遍历文件。

处理完一个文件中的所有模式后,我需要写出更改后的树。

我只需要对其进行后期处理即可修复文本。

我一直在谷歌搜索、阅读和观看大量教程,但我感到很困惑。

感谢您对此提供的任何帮助。

最佳答案

看来您想要 .replaceWith()方法,您必须首先找到您想要匹配的文本的所有出现位置:

from bs4 import BeautifulSoup

cases = '''
<aside epub:type='footnote' id="FN96"><p class="x"><a class="notebackref" href="#bk1_21_9"><span class="notemark">*</span>text</a>
<span class="xt"> <a class='bookref' href='bk50.xhtml#bk50_118_26'>some text with these digits: 26:118</a></span></p></aside>

<aside epub:type='footnote' id="FN100"><p class="x"><a class="notebackref" href="#bk1_21_42"><span class="notemark">*</span>text</a>
<span class="xt">some text with these digits: 26:118</span></p></aside>

<aside epub:type='footnote' id="FN107"><p class="f"><a class="notebackref" href="#bk1_22_44"><span class="notemark">§</span>text</a>
<span class="ft">some text with these digits: 22</span></p></aside>
'''

soup = BeautifulSoup(cases, 'lxml')

case1 = soup.findAll('a',{'class':'bookref'})
case2 = soup.findAll('span',{'class':'xt'})
case3 = soup.findAll('span',{'class':'ft'})

for match in case1 + case2 + case3:
text = match.string
print(text)
if text:
newText = text.replace('some text', 'modified!') # this line is your regex things
text.replaceWith(newText)

循环中的print(text)打印:

some text with these digits: 26:118
None
some text with these digits: 26:118
some text with these digits: 22

如果我们现在再次调用它:

modified! with these digits: 26:118
None
modified! with these digits: 26:118
modified! with these digits: 22

关于Python:BeautifulSoup修改文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45598748/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com