2016-05-20 2 views
-1

Что я хочу сделать, это изменить каждый тег (будь то его <a href=> или <title> или </title> или </div> ... и т. Д.) На символ.Изменить все теги html на символ с помощью python

Я попытался использовать красивый суп, но он находит только теги, которые я определяю ...

Я нашел некоторый код в HTMLparser.py

tagfind = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*') 

Я считаю, это то, что я ищу Я просто не знаю, как правильно его использовать.

Кроме того, я полагал, что я мог бы использовать:

handle_starttag(self, tag, attrs): 

Но я не хочу, чтобы определить тег, я просто хочу сценарий, чтобы найти каждый тег и изменить его на что-то ...

Возможно ли это?

Благодарим за оказанную помощь!

+0

Очень много тегов. Какова ваша конечная цель? –

+0

Удалить тег EVERY из HTML и заменить их на символ –

+0

Я имею в виду, почему вы хотите это сделать? –

ответ

0

BeautifulSoup здесь не очень хорошая идея - это предназначено для синтаксический анализ HTML, не редактируя его.

Кроме того, что регулярное выражение не кажется очень хорошим (только соответствует содержанию внутри тега, а не сам весь тег), так что я нашел другую, которая будет лучше всего подходит для ваших целей:

</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)/?> 

Этот тег будет соответствовать что-нибудь вроде следующего:

<h1> 
</h1> 
<img src="foo.com/image.png"> 

Мы можем использовать это для замены всех тегов с помощью re.sub. Это находит все совпадения для определенного регулярного выражения и заменяет их чем-то другим. Вот как вы будете использовать его для того, что вы хотите сделать:

import re 

html_regex = r"""</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)/?>""" 
html = "<h1>Foo</h1>" 

print(re.sub(html_regex, "@", html)) 

Это будет печатать:

@[email protected] 
+0

Это выглядит великолепно! Спасибо!!! –

+1

@HarpAngell Нет проблем! Не забудьте принять ответы, которые вам помогли. –

+0

просто отсутствует конец) на функции печати, но он работает !! –

1

Гораздо более надежным способом является рекурсивно посетить каждую метку, я просто изменил имя пример ниже, но вы можете делать все, что вы хотите, когда у вас есть тег:

from bs4 import BeautifulSoup, element 

def visit(s): 
    if isinstance(s, element.Tag): 
     has_children = s.find_all() 
     if has_children: 
      s.name = "foobar" 
      for child in s: 
       visit(child) 
     else: 
      s.name = "foobar" 

использовать:

soup = BeautifulSoup(...) 
visit(soup) 

Тогда любые изменения будут отражены в супе.

+0

У меня нет тега, хотя ... –

+0

@HarpAngell, о каком теге вы говорите? Вы просто передаете суп функции и делаете все, что хотите, когда найдете тег, запускаете код на каком-то html, а затем печатаете суп после –

+0

. Вы сказали «когда у вас есть тег», но теперь я понимаю, что вы имеете в виду, тег –

Смежные вопросы