Python: ключевое слово для ссылок - PullRequest
1 голос
/ 23 июля 2011

Я создаю блог на Google App Engine. Я хотел бы преобразовать некоторые ключевые слова в сообщениях моего блога в ссылки, точно так же, как вы видите во многих блогах WordPress.

Вот один плагин WP, который делает то же самое: http://wordpress.org/extend/plugins/blog-mechanics-keyword-link-plugin-v01/

Плагин, который позволяет определять пары ключевое слово / ссылка. Ключевые слова автоматически связываются в каждом из ваших сообщений.

Я думаю, что это больше, чем простая замена Python. Я имею дело с HTML-кодом. Иногда это может быть довольно сложно.

Возьмем следующий фрагмент кода в качестве примера. Я хочу преобразовать слово example в ссылку на http://example.com:

Here is an example link:<a href="http://example.com">example.com</a>

Простая функция замены Python, которая заменяет example на <a href="http://example.com">example</a>, выдает:

Here is an <a href="http://example.com">example</a> link:<a href="http://<a href="http://example.com">example</a>.com"><a href="http://example.com">example</a>.com</a>

но я хочу:

Here is an <a href="http://example.com">example</a> link:<a href="http://example.com">example.com</a>

Есть ли какой-нибудь плагин Python, способный на это? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Это примерно то, что вы могли бы сделать, используя Beautifulsoup :

from BeautifulSoup import BeautifulSoup

html_body ="""
Here is an example link:<a href='http://example.com'>example.com</a>
"""
soup = BeautifulSoup(html_body)
for link_tag in soup.findAll('a'):
    link_tag.string = "%s%s%s" % ('|',link_tag.string,'|')
for text in soup.findAll(text=True):
    text_formatted = ['<a href=""http://example.com"">example</a>'\ 
    if word == 'example' and not (word.startswith('|') and word.endswith('|'))\
    else word for word in foo.split() ]
    text.replaceWith(' '.join(text_formatted))
for link_tag in soup.findAll('a'):
    link_tag.string = link_tag.string[1:-1]
print soup

В основном я убираю весь текст из post_body, заменяя слово в качестве примера на заданноессылка, не касаясь текста ссылок, которые сохраняются с помощью '|'символы при разборе.

Это не на 100% идеально, например, оно не работает, если слово, которое вы пытаетесь заменить, заканчивается точкой;с некоторым терпением вы можете исправить все крайние случаи.

1 голос
/ 23 июля 2011

Это, вероятно, лучше подходит для клиентского кода. Вы можете легко изменить подсветку слов , чтобы получить желаемые результаты. Сохраняя эту клиентскую сторону, вы можете избежать истечения срока действия кэшей страниц при изменении ваших «тегов».

Если вам действительно нужно, чтобы он обрабатывался на стороне сервера, вам нужно использовать re.sub , который позволяет вам передать функцию, но если вы не работаете с простым текстом, вы будете сначала необходимо проанализировать HTML-код, используя что-то вроде minidom , чтобы убедиться, что вы не заменяете что-либо в середине каких-либо элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...