簡體   English   中英

如何用帶有類的單個標簽替換嵌套的塊引用標簽?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM