如何用带有类的单个标记替换嵌套的blockquote标记?

2024-04-24 09:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我继承了几千个凌乱的HTML文件,它们使用重复的blockquote标记来显示一首诗的行

示例:

<blockquote><blockquote>roses are red</blockquote></blockquote><br> <blockquote><blockquote><blockquote>violets are blue</blockquote></blockquote></blockquote><br> <blockquote><blockquote>this is another line</blockquote></blockquote><br> <blockquote><blockquote><blockquote>and this is too</blockquote></blockquote></blockquote><br>

对于自由诗的行,您将看到多达7-8个块引号标记包装一行文本。我想用单个<p><span>标记替换嵌套的blockquote标记集,并给它一个类,如“indent-7”或“indent-8”

blockquote标记之间存在不可预测的空白。有些在它们之间有空格,有些被新行隔开。我认为Python的BeautifulSoup是处理此任务的方法

如何将嵌套的blockquote标记替换为具有“n”类的单个标记,其中n是嵌套的标记数


Tags: 文件标记br示例ishtmlanotherblue
2条回答

您可以手动删除空白和新LINR。一旦消除了这一点,这将使工作更容易

假设这不是一个可以考虑的选项,你可以使用PHP做那个

$html = preg_replace('~>\\s+<~m', '><', $html);

现在,要替换块引号,您甚至可以使用记事本++查找/替换功能,您只需要找到一个模式。例如,对于当前代码,最多有两个或三个blockquotes。因此,在Notepad++中,您需要执行四个操作“查找/替换全部”

  • 搜索<blockquote><blockquote>并替换为<p>(或按您的意愿设置范围)
  • 搜索</blockquote></blockquote>并替换为</p>(或按您的意愿进行扩展)
  • 搜索<blockquote><blockquote><blockquote>并替换为<p>(或按您的意愿设置范围)
  • 搜索</blockquote></blockquote></blockquote>并替换为</p>(或按您的意愿进行扩展)

以下是我将如何使用lxml实现它:

(请注意,我在这首诗中添加了一行,以测试用空格分隔的标记。)

poem = """
<doc>
  <blockquote><blockquote>roses are red</blockquote></blockquote><br/>
  <blockquote>     <blockquote>roses are green</blockquote></blockquote><br/>
       <blockquote>
         <blockquote><blockquote>violets are blue</blockquote></blockquote></blockquote><br/>
    <blockquote><blockquote>this is another line</blockquote></blockquote><br/>
    <blockquote><blockquote><blockquote>and this is too</blockquote></blockquote></blockquote><br/>

</doc>
"""

doc = lxml.html.fromstring(poem)
targ = doc.xpath('//text()[normalize-space(.)]')
for t in targ:
    count = int(t.getparent().xpath("count(.//ancestor::*[name()='blockquote'])"))
    print(f'<blockquote indent="{count}">{t}<</blockquote>')

输出:

<blockquote indent="2">roses are red<</blockquote>
<blockquote indent="2">roses are green<</blockquote>
<blockquote indent="3">violets are blue<</blockquote>
<blockquote indent="2">this is another line<</blockquote>
<blockquote indent="3">and this is too<</blockquote>

为了更好地衡量(也为了未来读者的利益),我将使用xquery这样做:

let $j := <doc>
...text of poem above... 
</doc>

for $targ in $j//text()[normalize-space(.)] 

let $line := $targ/data(.) 
let $count := count($targ/ancestor::blockquote)
return 
<blockquote nested="{$count}">{$line}</blockquote>

输出相同

相关问题 更多 >