在Python中合并具有相同内容但重叠HTML标记的多个字符串
标题本身并不是一个明确的问题,因此我将提供一个示例: 我有一个字符串示例:在Python中合并具有相同内容但重叠HTML标记的多个字符串,python,regex,string,nlp,Python,Regex,String,Nlp,标题本身并不是一个明确的问题,因此我将提供一个示例: 我有一个字符串示例: 为客户端创建和管理网站,以安全地进行通信 它有很多“版本”。这意味着字符串“版本”中的一个单词或短语将包含在HTML div标记中,即foo bar。(这些标记是任意的,字体大小属性的数字对应于分数,这些分数稍后将用作其他CSS功能,而这些功能现在是不相关的。)以下是字符串的4个版本: 为客户端创建和管理网站,以安全地进行通信 为客户创建和管理网站,以便进行安全通信 为客户创建和管理网站,以便进行安全通信 为客户创建和
为客户端创建和管理网站,以安全地进行通信
它有很多“版本”。这意味着字符串“版本”中的一个单词或短语将包含在HTML div标记中,即foo bar
。(这些标记是任意的,字体大小属性的数字对应于分数,这些分数稍后将用作其他CSS功能,而这些功能现在是不相关的。)以下是字符串的4个版本:
为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
我想将所有这些版本合并到以下内容中:
为客户创建和管理安全通信的网站
正如我们在这里看到的,有重叠的标记(在font-size:2
和font-size:1
的标记中)。字符串的版本数可能介于1到50之间,因此可能存在多个重叠
以下是到目前为止我使用正则表达式得到的结果:
重新导入
div_str=“这不是一个正确的答案
我要提到的是,用正则表达式解析HTML通常会给生活带来不必要的困难
从您作为示例提供的每一行中恢复文本很容易。我假设每一行都是更大结构的一部分;因此,我将每一行都包含在div
中
在这里,我使用BeautifulSoup从您的每一行中获取文本
>>> for line in open('temp.htm').readlines():
... line = line.strip()
... print(line)
... soup = bs4.BeautifulSoup(line, 'lxml')
... soup.find('div').text
...
<div>Created and <div style="font-size: 1">managed</div> websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and <div style="font-size: 2">managed websites</div> for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and managed websites for clients to <div style="font-size: 3">communicate</div> securely</div>
'Created and managed websites for clients to communicate securely'
<div><div style="font-size: 4">Created</div> and managed websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
>>用于打开的行('temp.htm')。readlines():
…line=line.strip()
…打印(行)
…soup=bs4.BeautifulSoup(行“lxml”)
…soup.find('div').text
...
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
不幸的是,我不明白通常如何将输入行映射到输出HTML。这不是一个正确的答案
我要提到的是,用正则表达式解析HTML通常会给生活带来不必要的困难
从您作为示例提供的每一行中恢复文本很容易。我假设每一行都是更大结构的一部分;因此,我将每一行都包含在div
中
在这里,我使用BeautifulSoup从您的每一行中获取文本
>>> for line in open('temp.htm').readlines():
... line = line.strip()
... print(line)
... soup = bs4.BeautifulSoup(line, 'lxml')
... soup.find('div').text
...
<div>Created and <div style="font-size: 1">managed</div> websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and <div style="font-size: 2">managed websites</div> for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and managed websites for clients to <div style="font-size: 3">communicate</div> securely</div>
'Created and managed websites for clients to communicate securely'
<div><div style="font-size: 4">Created</div> and managed websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
>>用于打开的行('temp.htm')。readlines():
…line=line.strip()
…打印(行)
…soup=bs4.BeautifulSoup(行“lxml”)
…soup.find('div').text
...
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
不幸的是,我不明白通常情况下,如何将输入行映射到输出HTML。我找到了它。用BeautifulSoup替换正则表达式以简化解析,我根据div标记之间的文本长度对这些版本进行排序,以避免在查找子字符串时遇到任何问题
使用相同的样本:
为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
这些行在一个列表中表示,然后使用BeautifulSoup按其相应div标记之间的文本长度排序。以下是代码:
def\uu合并字符串(最终版本):
soup=BeautifulSoup(最后的“html.parser”)
对于汤中的固定div。查找所有(“div”):
如果未修复_div.text==version.text:
返回最终的\u str.replace(
version.text,unicode(版本)
)
返回最终搜索
已找到\u术语=(
(i,BeautifulSoup(i,“html.parser”).find(“div”))
因为我发现
)#版本及其div文本的成对列表
已找到\u项=已排序(
找到项,key=lambda x:len(x[-1].text),reverse=True
)#根据div文本的长度进行排序,以避免子字符串问题
当前_div=找到了_terms[0][0]#具有最大div文本的版本
对于x范围内的i(1,len(找到的项)):
当前\u div=\u合并\u字符串(当前\u div,找到的\u项[i][1])
我找到了答案。将regex替换为BeautifulSoup以简化解析,我根据div标记之间的文本长度对这些版本进行排序,以避免在查找子字符串时遇到任何问题
使用相同的样本:
为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
<