Как заменить вложенные теги blockquote одним тегом с классом? - PullRequest
0 голосов
/ 07 марта 2020

Я унаследовал несколько тысяч грязных 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 тегов блочных кавычек, обертывающих строку текста. Я хочу заменить набор вложенных тегов blockquote одним тегом <p> или <span> и присвоить ему класс, например «indent-7» или «indent-8».

Есть непредсказуемый пробел между тегами blockquote. У некоторых есть пробелы между ними, некоторые разделены новыми строками. Я думаю, что BeautifulSoup Python - это способ справиться с этой задачей.

Как заменить вложенные теги blockquote одним тегом с классом «n», где n - это количество тегов, которые были вложенный

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вот как я подхожу к этому с l xml:

(Обратите внимание, что я добавил строку в стихотворение, чтобы проверить теги, разделенные пробелом.)

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>

Тот же вывод.

0 голосов
/ 09 марта 2020

Вы можете удалить пробелы и новые строки вручную. Как только это будет удалено, это должно упростить работу.

Предполагая, что это не вариант, вы можете использовать PHP для этого

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

Теперь, чтобы заменить цитаты, которые вы можете даже используйте функцию поиска / замены Notepad ++, вам просто нужно найти шаблон. Например, в текущем коде максимум две или три цитаты. Итак, в Notepad ++ вам нужно будет выполнить четыре операции: найти / заменить все

  • , поиск <blockquote><blockquote> и заменить на <p> (или span, как вы хотите)
  • search для </blockquote></blockquote> и замените на </p> (или интервал, как вы хотите)
  • найдите <blockquote><blockquote><blockquote> и замените на <p> (или интервал, как вы хотите)
  • поиск </blockquote></blockquote></blockquote> и заменить на </p> (или интервал, как вы хотите)
...