[英]How to replace nested blockquote tags with single tag with class?
我继承了几千凌乱的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 是处理此任务的方法。
如何使用类为“n”的单个标记替换嵌套的blockquote
标记,其中 n 是嵌套的标记数?
这是我将如何使用 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>
相同的输出。
您可以手动删除空格和新的 linrs。 一旦删除,它应该使工作更容易。
假设这不是要考虑的选项,您可以使用 PHP
$html = preg_replace('~>\\s+<~m', '><', $html);
现在要替换块引号,您甚至可以使用 Notepad++ 查找/替换功能,您只需要找到一个模式。 例如,使用当前的代码,最多有两个或三个块引用。 因此,在 Notepad++ 中,您需要执行四次查找/替换所有操作
<blockquote><blockquote>
并替换为<p>
(或按您的意愿跨度)</blockquote></blockquote>
并替换为</p>
(或按您的意愿跨度)<blockquote><blockquote><blockquote>
并替换为<p>
(或按您的意愿跨度)</blockquote></blockquote></blockquote>
并替换为</p>
(或按您的意愿跨度)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.