1

たとえば、いくつかのキーワードを文字列内のURLに置き換えます。

content.replace("Google","<a href="http://www.google.com">Google</a>")

ただし、まだURLでラップされていない場合にのみ、キーワードをURLに置き換えたいと思います。

コンテンツは単純なHTMLです。

<p><b>This is an example!</b></p><p>I love <a href="http://www.google.com">Google</a></p><p><a href="http://www.google.com"><img src="/google.jpg" /></a></p>

<a><img>タグ。

主な質問:キーワードがすでに<a>または<img>タグでラップされているかどうかを判断するにはどうすればよいですか?

PHPでの同様の質問は、URLでまだラップされていない場合にのみ、キーワードを検索してURLに置き換えますが、答えは効率的なものではありません。

Pythonにもっと良い解決策はありますか?コード例を使用するとよいでしょう。ありがとう!

4

3 に答える 3

4

HTMLを正規表現で解析するのは難しいことがわかっているので、HTMLの解析にBeatifulSoup使用しています。美しいスープを使用する場合は、previous_siblingとprevious_elementを使っておもちゃで必要なものを見つけることができます。

あなたはこのように相互作用します:

soup.find_all('img')
于 2012-06-09T21:02:42.560 に答える
3

クリストップが言ったように、BeautifulSoupは行く方法です:

from BeautifulSoup import BeautifulSoup, Tag, NavigableString
import re    

html = """
<div>
    <p>The quick brown <a href='http://en.wikipedia.org/wiki/Dog'>fox</a> jumped over the lazy Dog</p>
    <p>The <a href='http://en.wikipedia.org/wiki/Dog'>dog</a>, who was, in reality, not so lazy, gave chase to the fox.</p>
    <p>See image for reference:</p>
    <img src='dog_chasing_fox.jpg' title='Dog chasing fox'/>
</div>
"""
soup = BeautifulSoup(html)

#search term, url reference
keywords = [("dog","http://en.wikipedia.org/wiki/Dog"),
            ("fox","http://en.wikipedia.org/wiki/Fox")]

def insertLinks(string_value,string_href):
    for t in soup.findAll(text=re.compile(string_value, re.IGNORECASE)):
            if t.parent.name !='a':
                    a = Tag('a', name='a')
                    a['href'] = string_href
                    a.insert(0, NavigableString(string_value))
                    string_list = re.compile(string_value, re.IGNORECASE).split(t)
                    replacement_text = soup.new_string(string_list[0])
                    t.replace_with(replacement_text)
                    replacement_text.insert_after(a)
                    a.insert_after(soup.new_string(string_list[1]))


for word in keywords:
    insertLinks(word[0],word[1])

print soup

降伏します:

<div>
    <p>The quick brown <a href="http://en.wikipedia.org/wiki/Dog">fox</a> jumped over the lazy <a href="http://en.wikipedia.org/wiki/Dog">dog</a></p>
    <p>The <a href="http://en.wikipedia.org/wiki/Dog">dog</a>, who was, in reality, not so lazy, gave chase to the <a href="http://en.wikipedia.org/wiki/Fox">fox</a>.</p>
    <p>See image for reference:</p>
    <img src="dog_chasing_fox.jpg" title="Dog chasing fox"/>
</div>
于 2012-06-09T22:02:40.677 に答える
0

前の投稿で述べたように、正規表現を追加してみることができます。まず、文字列を正規表現と照合して、すでにURLにラップされているかどうかを確認します。これは、reライブラリへの単純な呼び出しであり、そのsearch()メソッドでうまくいくので非常に簡単です。

正規表現と検索方法が特に必要な場合は、次のチュートリアルをご覧ください。http ://www.tutorialspoint.com/python/python_reg_expressions.htm

文字列がすでにURLにラップされているかどうかを確認した後、まだURLにラップされていない場合は、replace関数を呼び出すことができます。

これが私が書いた簡単な例です:

    import re

    x = "<a href=""http://www.google.com"">Google</a>"
    y = 'Google'

    def checkURL(string):
        if re.search(r'<a href.+', string):
            print "URL Wrapped Already"
            print string
        else:
            string = string.replace('Google', "<a href=""http://www.google.com"">Google</a>")
            print "URL Not Wrapped:"
            print string

    checkURL(x)
    checkURL(y)

これがあなたの質問に答えることを願っています!

于 2012-06-09T11:34:18.803 に答える