-2

我继承了数千个杂乱无章的 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”。</p>

blockquote标签之间有不可预知的空白。有些在它们之间有空格,有些用新行分隔。我在想 Python 的 BeautifulSoup 是处理这个任务的方法。

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

4

2 回答 2

1

这就是我用 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>

相同的输出。

于 2020-03-12T15:13:45.013 回答
-1

您可以手动删除空格和新的 linr。一旦删除,它应该使工作更容易。

假设这不是要考虑的选项,您可以使用 PHP

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

现在要替换块引用,您甚至可以使用 Notepad++ 查找/替换功能,您只需要找到一个模式。例如,使用您拥有的当前代码,最多有两个或三个块引用。因此,在 Notepad++ 中,您需要执行四个操作查找/替换所有

  • 搜索<blockquote><blockquote>并替换为<p>(或根据您的需要跨越)
  • 搜索</blockquote></blockquote>并替换为</p>(或根据您的需要跨越)
  • 搜索<blockquote><blockquote><blockquote>并替换为<p>(或根据您的需要跨越)
  • 搜索</blockquote></blockquote></blockquote>并替换为</p>(或根据您的需要跨越)
于 2020-03-09T09:14:41.843 回答