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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.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 BeautifulSoup-在找到的关键字周围添加标记_Python_Html_Insert_Tags_Beautifulsoup - Fatal编程技术网

Python BeautifulSoup-在找到的关键字周围添加标记

Python BeautifulSoup-在找到的关键字周围添加标记,python,html,insert,tags,beautifulsoup,Python,Html,Insert,Tags,Beautifulsoup,我目前正在一个项目中工作,我想允许在一组巨大的HTML文件中进行正则表达式搜索 在第一次确定我感兴趣的文件之后,我现在想突出显示找到的关键字 使用BeautifulSoup,我可以确定找到我的关键字的节点。我做的一件事是改变整个家长的颜色 然而,我也想在我找到的关键字周围添加我自己的标签 使用BFSoup提供的find()函数来确定位置并不是什么大问题。但是在常规文本周围添加我的标签似乎是不可能的 # match = keyword found by another regex # node =

我目前正在一个项目中工作,我想允许在一组巨大的HTML文件中进行正则表达式搜索

在第一次确定我感兴趣的文件之后,我现在想突出显示找到的关键字

使用BeautifulSoup,我可以确定找到我的关键字的节点。我做的一件事是改变整个家长的颜色

然而,我也想在我找到的关键字周围添加我自己的标签

使用BFSoup提供的find()函数来确定位置并不是什么大问题。但是在常规文本周围添加我的标签似乎是不可能的

# match = keyword found by another regex
# node = the node I found using the soup.find(text=myRE)
node.parent.setString(node.replace(match, "<myspan>"+match+"</myspan>"))
#match=另一个正则表达式找到的关键字
#node=我使用soup.find(text=myRE)找到的节点
node.parent.setString(node.replace(匹配“+match+”))
通过这种方式,我只添加了文本,而没有添加正确的标记,因为文档不是新解析的,我希望避免这种情况

我希望我的问题变得有点清楚:)

如果您添加文本

my_tag = node.parent.setString(node.replace(match, "<myspan>"+match+"</myspan>"))
它应该被分类为BS标记对象,并可用于解析

您可以将这些更改应用于原始文本,并将其作为一个整体运行,以避免重复

编辑:

从:

#下面是一个更复杂的示例,用一个标记替换另一个标记:
从BeautifulSoup导入BeautifulSoup,标记
汤=美丽的汤(“啊!福布拉!”)
标签=标签(汤,“新标签”[(“id”,1)])
插入(0,“万岁!”)
汤a.替换为(标签)
印花汤
#啊!好极了废话!

下面是一个简单的示例,展示了一种方法:

import re
from bs4 import BeautifulSoup as Soup

html = '''
<html><body><p>This is a paragraph</p></body></html>
'''
(2) 获取要加粗的单词的起始和结束位置(为我的英语道歉)

(3) 拆分文本并添加第一部分

soup.p.append(text[:start])
print soup
(4) 创建一个标记,向其添加相关文本并将其附加到父级

b = soup.new_tag('b')
b.append(text[start:end])
soup.p.append(b)
print soup
(5) 附加文本的其余部分

soup.p.append(text[end:])
print soup
下面是上面的输出:

<html><body><p></p></body></html>
<html><body><p>This is </p></body></html>
<html><body><p>This is <b>a</b></p></body></html>
<html><body><p>This is <b>a</b> paragraph</p></body></html>

这是

这是一个

这是一段


setString不返回任何内容。BeatifulSoup(节点)不会更改主汤。因此,我需要再次解析整个文件并进行更改,我希望避免这种情况!这也无济于事:(在这里他们用一个自定义标记替换整个-标记。但是,我没有标记。我只是用一堆单词中的几个单词,我想用一个新标记来包围它们。因此,一个想法是创建另一个汤并替换整个节点,如果这是你的意思:)但是,这不是一个好的解决方案,因为家长可以任意大。更好的方法是告诉BFSoup只需重新分析某个节点并将其合并到DOM中,我找不到方法解决这个问题。这不是我最后所做的,但它与我的想法非常接近!所以我接受了这个答案,因为它解决了问题!我将改变我的实现。不知道我可以将文本和标记附加到节点:)谢谢!
soup.p.append(text[:start])
print soup
b = soup.new_tag('b')
b.append(text[start:end])
soup.p.append(b)
print soup
soup.p.append(text[end:])
print soup
<html><body><p></p></body></html>
<html><body><p>This is </p></body></html>
<html><body><p>This is <b>a</b></p></body></html>
<html><body><p>This is <b>a</b> paragraph</p></body></html>