У меня есть абзац BeautifulSoup в виде строки. Я хочу заменить вхождение тегов п (открытие) и /п (закрытие) в строку с помощью регулярных выражений, потому что есть такие экземпляры, как
<p class = "section-para">We would be happy to hear from you, Please
fill in the form below or mail us your requirements on<br/><span
class = "text-red">[email protected]</span></p>
Но я не могу использовать универсальный
^< *>$
потому что мне нужны теги сильныйсильный>, б и h1,h1..h6 для разных целей.
Я знаю только основы RegEx, но не знаю, как его создавать и использовать. Может ли кто-нибудь помочь мне с созданием "включения", "исключения" (если есть). Как я могу сделать это для этой проблемы и как я могу заменить его простым ''
def formatting(string):
this=['<h1>','</h1>','<h2>','</h2>','<h3>','</h3>','<h4>','</h4>','<h5>','</h5>','<h6>','</h6>','<b>','</b>','<strong>','</strong>']
with_this=['\nh1 Tag:','\n','\nh2 Tag:','\n''\nh3 Tag:','\n''\nh4 Tag:','\n''\nh5 Tag:','\n''\nh6 Tag:','\n','\Bold:','\n''\nBold:','\n']
for i in range(len(this)):
if this[i] in string:
string=string.replace(this[i],with_this[i])
return(string)
Я использовал функции замены строк для тегов ч1,2...6. Любая помощь будет оценена по достоинству.
Если вы уже приложили усилия, чтобы использовать красивый суп для анализа вашего html, не используйте регулярное выражение. Regex никогда не рекомендуется для разбора/замены html
Привет! Как правило, синтаксический анализ HTML с помощью RegEx считается дурацкой задачей. См. stackoverflow.com/a/1732454/3543867 . Есть много крайних случаев, с которыми вы можете столкнуться. Одной из распространенных ссылок для обработки html является модуль/библиотека BeautifulSoup — stackoverflow.com/questions/11709079/parsing-html-using-pythна.
Хотя говорят, что Чак Норрис умеет использовать регулярное выражение в html...
Хотя верно то, что вы не можете написать регулярное выражение, которое соответствует только допустимому html, и попытка сделать это в любом случае вызовет ужасный Zalgo в нашу реальность, простая попытка сопоставить открытие и закрытие тега <p> может быть на самом деле возможно. потому что вы не можете вложить <p> в другой <p> (или, по крайней мере, вы не должны).
@Kevin Так в чем же решение. Подойдет любая ссылка.
На самом деле, я думаю, что неправильно понял вопрос. Если вы Только хотите заменить теги <p> и ничего больше, это возможно. Но похоже, вы также хотите заменить <b> и <strong>. Эти теги могу являются вложенными, поэтому вы не можете написать регулярное выражение, соответствующее им.
Чем вы хотите заменить <p>?
@ChrisDoyle просто ''. х='123'; х.заменить('1',''); х=23
@Kevin, даже когда я сохраняю все проанализированное значение в виде строки в переменной, а затем обрабатываю его посимвольно. Я знаю, что это глупейшая идея, но я не знаю другого метода.
Надеюсь, я вас правильно понял, и, пожалуйста, поправьте меня, если я ошибаюсь. У вас есть что-то вроде:
<p class = "section-para">We would be happy to hear from you, Please
fill in the form below or mail us your requirements on<br/><span
class = "text-red">[email protected]</span></p>
И хотите что-то вроде:
<p>We would be happy to hear from you, Please
fill in the form below or mail us your requirements on<br/><span
class = "text-red">[email protected]</span></p>
Вы можете просто сделать:
saved_content = re.search(
'<p (.*?)>(?P<content>.*)</p>',
your_string
).groupdict()
result = re.sub(
r'<p (.*?)>(.*)</p>',
f'<p>{saved_content.get("content")}</p>',
your_string
)
Обратите внимание, что я использовал f-строки, которые доступны только в Python 3.6 или выше. Я надеюсь, что это помогло вам, и дайте мне знать, если я что-то неправильно понял или остались какие-либо вопросы. Хорошего дня!
Спасибо за ответ, примерно так. Но оригинальная работа, которую я хочу сделать, выглядит вот так.- stackoverflow.com/questions/56688597/…
Если этот ответ является правильным для данного конкретного вопроса, вы должны отметить его как правильный ответ. Я посмотрю и другие вопросы.
Ваш другой вопрос не имеет смысла. зачем тег заголовка (h1,h2...h6) внутри тега p. тег заголовка по существу закрывает тег p с точки зрения древовидной структуры html. Если вы заглянете в FAQ, лучший способ получить помощь — это создать минимальный полный пример того, что вы пытаетесь сделать. Это означает, предоставить образец вашего ввода. покажите, что вы ожидаете получить на выходе, и покажите любой код, который вы пробовали.
Неясно, что именно вы хотите заменить, но, возможно, приведенное ниже может помочь, оно позволит вам заменить теги текстом, если это то, что вам нужно. Я уверен, что вы сможете настроить fruther, чтобы он делал то, что вы хотите. Также вы не указали версию BS, которую вы используете. Я использую БС4. Функция возьмет объект «Прекрасный суп», тег для поиска, префикс, то есть то, чем вы хотите заменить начальный тег, и суффикс, то есть то, чем вы хотите заменить конечный тег.
from bs4 import BeautifulSoup
def format_soup_tag(soup, tag, prefix, suffix):
target_tag = soup.find(tag)
target_tag.insert_before(prefix)
target_tag.insert_after(suffix)
target_tag.unwrap()
html = '<p class = "section-para">We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class = "text-red" >[email protected]</span></p>'
soup = BeautifulSoup(html, features = "lxml")
print("###before modification###\n", soup, "\n")
format_soup_tag(soup, 'p', '\np tag: ', '\n')
print("###after p tag###\n", soup, "\n")
format_soup_tag(soup, 'strong', '\Bold: ', ' \Bold')
print("###after strong tag###\n", soup, "\n")
ВЫХОД
###before modification###
<html><body><p class = "section-para">We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class = "text-red">[email protected]</span></p></body></html>
###after p tag###
<html><body>
p tag: We would be happy to hear from you, <strong>Please fill in the form below</strong> or mail us your requirements on <br/><span class = "text-red">[email protected]</span>
</body></html>
###after strong tag###
<html><body>
p tag: We would be happy to hear from you, \Bold: Please fill in the form below \Bold or mail us your requirements on <br/><span class = "text-red">[email protected]</span>
</body></html>
Спасибо за ответ, который был полезен. также я хочу добавить значения h1,h2,h3, как вы сделали для сильного, если они присутствуют в абзаце.
Функция написана таким образом, чтобы быть гибкой, поэтому вы можете добавить больше строк, если хотите, например, format_soup_tag(soup, 'h1', '\nh1 tag: ', '\n')
, вы даже можете создать словарь имен тегов с массивом префиксов и суффиксов и перебирать словарь