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>or<img>标记中?

这是 PHP 中的一个类似问题find and replace keywords with urls ONLY if not already Wrap in a url,但答案不是有效的。

Python中有更好的解决方案吗?代码示例更好。谢谢!

4

3 回答 3

4

我正在使用Beatiful Soup来解析我的 HTML,因为使用正则表达式解析HTML 可能......被证明很棘手。如果你使用漂亮的汤,你可以玩弄previous_sibling和 previous_element 找出你需要什么。

您以这种方式进行交互:

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

正如 Chris-Top 所说,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 中,则可以调用替换函数。

这是我写的一个简单的例子:

    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 回答