Python 以编程方式突出显示HTML中的文本
我有一个原始HTML文件,看起来像这样(内容可能会不时更改,我们所知道的是它是一个有效的HTML文件):Python 以编程方式突出显示HTML中的文本,python,html,Python,Html,我有一个原始HTML文件,看起来像这样(内容可能会不时更改,我们所知道的是它是一个有效的HTML文件): 你好,世界 这是我的段落 另一个文本 当我在浏览器中打开它时,它看起来是这样的: 现在,我想突出显示这个HTML文件中的一些文本部分。 假设我想突出显示文本:“世界这是我的另一段” 预期产出: <HTML> <BODY> <h1>Hello <mark>World</mark></h1>
你好,世界
这是我的段落
另一个文本
当我在浏览器中打开它时,它看起来是这样的:
现在,我想突出显示这个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脚本文件
寻找提示,在哪里可以找到解决方案?用于此目的的好软件是[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)您希望我们