[英]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.