2

私は現在、HTML ファイルの膨大なセットで正規表現検索を許可したいプロジェクトに取り組んでいます。

最初に興味のあるファイルを特定した後、見つかったキーワードを強調表示したいと思います!

BeautifulSoup を使用すると、キーワードが見つかったノードを特定できます。私がすることの 1 つは、親全体の色を変更することです。

ただし、見つけたキーワードだけに独自の <span>-Tags を追加したいと思います。

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>"))

この方法では、適切なタグではなく単なるテキストのみを追加します。これは、ドキュメントが新たに解析されていないためです。これは回避したいと考えています!

私の問題が少し明確になったことを願っています:)

4

2 に答える 2

3

これを行う 1 つの方法を示す簡単な例を次に示します。

import re
from bs4 import BeautifulSoup as Soup

html = '''
<html><body><p>This is a paragraph</p></body></html>
'''

(1) テキストを保存し、タグを空にする

soup = Soup(html)
text = soup.p.string
soup.p.clear()
print soup

(2) 太字にする単語の開始位置と終了位置を取得する (私の英語で申し訳ありません)

match = re.search(r'\ba\b', text)
start, end = match.start(), match.end()

(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>
于 2013-02-01T23:47:54.397 に答える
2

文字を入れると…

my_tag = node.parent.setString(node.replace(match, "<myspan>"+match+"</myspan>"))

...そしてもう一度 BeautifulSoup に渡します

new_soup = BeautifulSoup(my_tag)

BS タグ オブジェクトとして分類し、解析に使用できるようにする必要があります。

繰り返しを避けるために、これらの変更を元の大量のテキストに適用し、全体として実行することができます。

編集:

ドキュメントから:

# Here is a more complex example that replaces one tag with another: 

from BeautifulSoup import BeautifulSoup, Tag
soup = BeautifulSoup("<b>Argh!<a>Foo</a></b><i>Blah!</i>")
tag = Tag(soup, "newTag", [("id", 1)])
tag.insert(0, "Hooray!")
soup.a.replaceWith(tag)
print soup
# <b>Argh!<newTag id="1">Hooray!</newTag></b><i>Blah!</i>
于 2013-02-01T18:42:47.040 に答える