Python - HTML - как изменить код путем преобразования текста вне тега в тег - PullRequest
0 голосов
/ 16 ноября 2018

Как заменить / преобразовать / исправить строку, представляющую тег в тег?

У меня есть пример ниже, где мне нужно очистить некоторые части кода и нужно преобразовать строки вроде</div> в правильные теги

html = """
    <html>
     <body>
      <div>
      &lt;/div&gt;  <----- how to convert the line into </div>
      <div class="first_class">
       <h1 id="Header_1">
        Header_1
       </h1>
      </div>
     </body>
    </html>  
"""

Я пытался

soup = BeautifulSoup(html,"lxml")

tag = soup.find(text="&lt;")
tag.replace_with("<")

print(soup.prettify())

, но эта логика не работает, функция поиска не принимает строку.Тот факт, что текст находится вне какого-либо тега, усложняет задачу.Как этого достичь?

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Использование str.replace

In [3]: print(html.replace('&lt;', '<').replace('&gt;', '>'))

    <html>
     <body>
      <div>
      </div>
      <div class="first_class">
       <h1 id="Header_1">
        Header_1
       </h1>
      </div>
     </body>
    </html>

Поместить в BeautifulSoup из файла. Сначала откройте файл, замените искаженный текст, а затем загрузите содержимое в BeautifulSoup. Примерно так

with open('malformed.html') as f:
    malformed = f.read()

html = malformed.replace('&lt;', '<').replace('&gt;', '>')

soup = bs4.BeautifulSoup(html)
0 голосов
/ 16 ноября 2018

Я думаю, вам нужна функция для их декодирования, например unescape на html.parser.

from html.parser import HTMLParser

unescape = HTMLParser().unescape 
html = """
    <html>
     <body>
      <div>
      &lt;/div&gt;  <----- how to convert the line into </div>
      <div class="first_class">
       <h1 id="Header_1">
        Header_1
       </h1>
      </div>
     </body>
    </html>  
"""

print(unescape(html))

Вывод

<html>
 <body>
  <div>
  </div>  <----- how to convert the line into </div>
  <div class="first_class">
   <h1 id="Header_1">
    Header_1
   </h1>
  </div>
 </body>
</html>  
0 голосов
/ 16 ноября 2018

Попробуйте вместо этого использовать регулярные выражения.

Что-то вроде:

html = re.sub("&lt;", "<", html)

для менее чем и

html = re.sub("&gt;", ">", html)

для более чем.

Сначала убедитесь, что вы import re.

Edit: для справки о том, как использовать re.sub - https://lzone.de/examples/Python%20re.sub

Edit2: после некоторых дальнейших исследований это похоже на str.replace () быстрее, так что вы можете использовать это вместо.

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