редактирование свойства tag.string с BeautifulSoup (bs4) в строку, включая разметку - PullRequest
0 голосов
/ 14 января 2020

У меня есть html документ, который я буду sh редактировать так, чтобы любое слово (слова) в нем можно было выделить / сделать жирным.

У меня есть html в памяти и перешел на BeautifulSoup. Я повторяю все теги и беру их строковые элементы. Если какая-либо строка содержит подходящее слово, я редактирую строку и заменяю ее на html с разметкой, обертывающей вокруг нужного слова.

from flask import Flask, Markup
from bs4 import BeautifulSoup

def match( documentText: str, searchQuery: str) -> Markup:
    words = documentText.split( ' ')
    if len( words) >= 3:
        words[2] = f'<strong>{ words[2]}</strong>'
        logger.info( f'{ words=}')

    return Markup( ' '.join( words))

for link in html.find_all( True):
    if ( link.string):
        link.string = match( link.string, searchQuery)

app = Flask( __name__)

@app.route( '/')
def home():
    logger.info( 'trying markup and testing logging') 
    return str( html), 200

app.run( debug=True)

Теперь вместо рендеринга страницы жирными словами, где я бы Как и они, я визуально вижу теги html, потому что если я просматриваю источник, теги на самом деле представлены &gt;. Похоже, что это происходит из строки "link.string = match (link.string, searchQuery)" - что, я думаю, вполне может иметь смысл, поскольку BeautifulSoup выполняет проверку типов и гарантирует единственное, что входит в тег. строковое поле действительно является строкой. Идеальным конечным состоянием, я думаю, было бы создание ответвления от тега для включения дочернего тега.

Является ли это проблемой, которую еще кто-либо ранее решал? Мое решение всей этой вещи кажется коренастым и не элегантным, поэтому я не возражаю против лучшего маршрута, если у кого-то есть такой.

1 Ответ

0 голосов
/ 14 января 2020

Для быстрого исправления просто замените эти html специальные символы на str.replace ()

from flask import Flask, Markup
from bs4 import BeautifulSoup
# ...
@app.route( '/')
def home():
    logger.info( 'trying markup and testing logging') 
    return str(html).replace("&gt;",">").replace("&lt","<"), 200

app.run( debug=True)

Будьте осторожны, поскольку html специальные символы - это не только &lt; и &gt;

Html ссылка на специальные символы: https://www.html.am/reference/html-special-characters.cfm

Лучший подход:

Этот подход изменит все html специальные символы обратно к его неэкранированная форма

import html.parser
htmlparser = html.parser.HTMLParser()
html_decoded_string = parser.unescape(str(html))
return html_decoded_string , 200

обратите внимание, что в Python 2 оператор импорта (имя модуля) может немного отличаться

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