2017-07-21 171 views
0

我有一个原始的HTML文件看起来像这样(的内容可能随时改变,我们都知道,这是一个有效的HTML文件):突出显示文本programmaticly

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

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

现在,我想突出显示此HTML文件中的一些文本部分。 假设我想突出显示文字:“世界这是我的另一段”。

预期输出:

<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脚本脚本文件。

虽然那个正则表达式是开始寻找解决方案的好地方。但是,一旦我进入一个场景,文本与多个父母分离,我就陷入了困境。更重要的是,可以在单词之间放置另一个元素(例如,img)。

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

+0

你的问题是** **尚不清楚,如果A)你想要我们写程序对你来说,这是**过于宽泛**(通常是令人难以接受的,甚至足够窄时不要太因为SO不是代码编写服务); B)请求我们为您找到一个这样做的库,这是一个异地资源的请求,这是** off-topic:资源请求**;或C)调试代码的请求,即** off-topic:无MCVE **,除非您提供调试[help/on-topic]中的问题所需的所有内容,包括[MCVE],但您已提供尽管说过你曾尝试过,但没有任何代码。 – Makyen

回答

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>' 
0

也许我会得到所有的NavigableString

https://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#contents此链接包含更多的信息后,使用beautifulsoup让体内标签的所有儿童(让身体是父母)。

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

或者您可以使用做一些递归下降HTML树结构(不这样做)的正则表达式是肯定的

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> ...