Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以编程方式突出显示HTML中的文本_Python_Html - Fatal编程技术网

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

Python 以编程方式突出显示HTML中的文本,python,html,Python,Html,我有一个原始HTML文件,看起来像这样(内容可能会不时更改,我们所知道的是它是一个有效的HTML文件): 你好,世界 这是我的段落 另一个文本 当我在浏览器中打开它时,它看起来是这样的: 现在,我想突出显示这个HTML文件中的一些文本部分。 假设我想突出显示文本:“世界这是我的另一段” 预期产出: <HTML> <BODY> <h1>Hello <mark>World</mark></h1>

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


你好,世界

这是我的段落

另一个文本
当我在浏览器中打开它时,它看起来是这样的:

现在,我想突出显示这个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>

你好,世界

这是我的段落

另一个文本

你有:

  • 原始HTML文件(如上图所示)
  • 您肯定知道的出现在HTML文本版本中的句子。请注意,这句话可以放在多个HTML节点中(如上面的示例所示。父节点:h1、p和div)
  • 用于自动突出显示过程的python脚本文件
我认为正则表达式是开始寻找解决方案的好地方。但当我进入一个文本被多个家长分割的场景时,我就被卡住了。此外,还可以在单词之间放置其他元素(例如img)


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

用于此目的的好软件是[BeautifulSoup]。使用
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>'
导入bs4 >>>soup=bs4.BeautifulSoup(打开('temp.htm').read(),'lxml') >>>new_h1=汤。new_标签('h1')) >>>new_h1.string='Hello' >>>马克=汤。新标签(‘马克’) >>>mark.string='World' >>>标记 世界 >>>新添加(标记) >>>纽约大学h1 你好,世界 >>>h1=汤。h1 >>>h1.将_替换为(新的_h1) 你好,世界 >>>对于soup.prettify().split('\n')中的行: ... 线 ... '' ' ' ' ' “你好” ' ' “世界” ' ' ' ' “” “这是我的段落” “

” ' ' “另一个文本” ' ' ' ' ''
用于此目的的好软件是[BeautifulSoup]。使用
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>'
导入bs4 >>>soup=bs4.BeautifulSoup(打开('temp.htm').read(),'lxml') >>>new_h1=汤。new_标签('h1')) >>>new_h1.string='Hello' >>>马克=汤。新标签(‘马克’) >>>mark.string='World' >>>标记 世界 >>>新添加(标记) >>>纽约大学h1 你好,世界 >>>h1=汤。h1 >>>h1.将_替换为(新的_h1) 你好,世界 >>>对于soup.prettify().split('\n')中的行: ... 线 ... '' ' ' ' ' “你好” ' ' “世界” ' ' ' ' “” “这是我的段落” “

” ' ' “另一个文本” ' ' ' ' ''
在获得所有导航字符串后,我可能会使用beautifulsoup来获取body标记中的所有子项(让body作为父项)

此链接包含更多信息

然后,您可以使用标记标记
content
重构字符串(内容),因为您可以从beautiful soup中提取内容和标记,然后将重构的字符串放回原处。正则表达式太痛苦了


或者,您可以使用html树结构下的一些递归(不要这样做)regex确实是一个混乱的解决方案

也许在获得所有Navigablesting之后,我会使用beautifulsoup来获取body标记中的所有子项(让body作为父项)

此链接包含更多信息

然后,您可以使用标记标记
content
重构字符串(内容),因为您可以从beautiful soup中提取内容和标记,然后将重构的字符串放回原处。正则表达式太痛苦了

或者您可以使用在html树结构下进行一些递归(不要这样做)。regex肯定是一个混乱的解决方案,作为提示:


步骤1:用%替换所有标记,并将替换的标记保存在列表中

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

步骤3:在匹配开始处插入
,在匹配结束处插入
。对于每个%组,在组之前插入
,在组末尾插入

%%%Hello <mark>World</mark>%%<mark>This is my paragraph</mark>%%%%<mark>another</mark>%text%%%
%%%Hello World%%这是我的段落%%%%

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

<HTML><body><h1>Hello <mark>World</mark></h1><p><mark>This is my paragraph</mark></p> ...
你好,世界这是我的段落

。。。
作为提示:


步骤1:用%替换所有标记,并将替换的标记保存在列表中

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

步骤3:在匹配开始处插入
,在匹配结束处插入
。对于每个%组,在组之前插入
,在组末尾插入

%%%Hello <mark>World</mark>%%<mark>This is my paragraph</mark>%%%%<mark>another</mark>%text%%%
%%%Hello World%%这是我的段落%%%%

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

<HTML><body><h1>Hello <mark>World</mark></h1><p><mark>This is my paragraph</mark></p> ...
你好,世界这是我的段落

。。。
如果A)您希望我们为您编写程序,您的问题不清楚,因为该程序太宽泛(通常不赞成,即使窄到不能太宽泛,因为这不是代码编写服务);B) 请求我们为您找到一个这样做的库,这是对非现场资源的请求,这是非主题的:资源请求;或者C)调试代码的请求,这是离题的:没有MCVE,除非您在中提供调试问题所需的所有内容,包括a,但您没有提供代码,尽管您已声明尝试过。如果a)您希望我们