以编程方式突出显示HTML中的文本

时间:2017-07-21 15:22:56

标签: python html

我的原始HTML文件看起来像这样(内容可能会不时更改,我们都知道它是一个有效的HTML文件):

<HTML>
    <BODY>
        <h1>Hello World</h1>
        <p>
            This is my paragraph
        </p>
        <div>
            another text
        </div>
    </BODY>
</HTML>

当我在浏览器中打开它时,它看起来像这样: Original file

现在,我想强调一下这个HTML文件中的一些文本部分。 让我们说我要突出显示文字:&#34; 世界这是我的段落&#34;。

预期产出:

<HTML>
    <BODY>
        <h1>Hello <mark>World</mark></h1>
        <p>
            <mark>This is my paragraph</mark>
        </p>
        <div>
            <mark>another</mark> text
        </div>
    </BODY>
</HTML>

Expected output

你有:

  • 原始HTML文件(如上所示)
  • 您确定知道的一个句子出现在HTML的文本版本中。请注意,这句话可以放在多个HTML节点中(如上例中所示。父节点:h1,p和div)。
  • 用于自动突出显示过程的python脚本脚本文件。

我认为Regex是开始寻找解决方案的好地方。但是当我进入一个文本被多个父母分裂的场景时,我就陷入了困境。更重要的是,可以在单词之间放置另一个元素(例如img&#39;)。

寻找提示,在哪里找到解决方案?

3 个答案:

答案 0 :(得分:0)

用于此目的的好软件是[BeautifulSoup]。1使用replace_with方法替换字符串或标签。使用new_tag方法创建标记以代替现有标记。首先制作现有HTML的“汤”。整个网络都有大量涉及BeautifulSoup的操作示例。

此示例代码显示了如何处理HTML中第一次出现的“Hello world”。

>>> import bs4
>>> soup = bs4.BeautifulSoup(open('temp.htm').read(), 'lxml')
>>> new_h1 = soup.new_tag('h1')
>>> new_h1.string = 'Hello '
>>> mark = soup.new_tag('mark')
>>> mark.string = 'World'
>>> mark
<mark>World</mark>
>>> new_h1.append(mark)
>>> new_h1
<h1>Hello <mark>World</mark></h1>
>>> h1 = soup.h1
>>> h1.replace_with(new_h1)
<h1>Hello World</h1>
>>> for line in soup.prettify().split('\n'):
...     line
...     
'<html>'
' <body>'
'  <h1>'
'   Hello'
'   <mark>'
'    World'
'   </mark>'
'  </h1>'
'  <p>'
'   This is my paragraph'
'  </p>'
'  <div>'
'   another text'
'  </div>'
' </body>'
'</html>'

答案 1 :(得分:0)

也许我会在获取所有NavigableString之后使用beautifulsoup来获取body标签中的所有子项(让body成为父项)

https://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#contents此链接包含更多信息。

然后,您可以使用标记标记<mark> Content </mark>重建字符串(内容),因为您可以从美丽的汤中提取内容和标记并将重建的字符串放回原位。正则表达式太痛苦了

或者你可以使用html树结构做一些递归(不要这样做)正则表达式肯定是一个混乱的解决方案

答案 2 :(得分:0)

作为提示:

步骤1:用%替换所有标签并将替换后的标签保存在列表

s1 = %%%Hello World%%This is my paragraph%%%%another%text%%%    
tags = ['<HTML>','<body>,<h1>,</h1>,<p> , ...]

第2步:在s1

中搜索正则表达式
World(\s|%)+This(\s|%)+is(\s|%)+my(\s|%)+paragraph(\s|%)+another

第3步:在匹配开头插入<mark>,最后插入</mark>。对于每个%组,在组前插入</mark>,在组末尾插入<mark>

%%%Hello <mark>World</mark>%%<mark>This is my paragraph</mark>%%%%<mark>another</mark>%text%%%

步骤4:现在,使用标记列表从列表中恢复标记。

<HTML><body><h1>Hello <mark>World</mark></h1><p><mark>This is my paragraph</mark></p> ...