Красивый суп заменяет <на < - PullRequest
0 голосов
/ 27 августа 2018

Я нашел текст, который хочу заменить, но при печати soup формат изменяется. <div id="content">stuff here</div> становится &lt;div id="content"&gt;stuff here&lt;/div&gt;. Как я могу сохранить данные? Я пробовал print(soup.encode(formatter="none")), но это выдает тот же неправильный формат.

from bs4 import BeautifulSoup

with open(index_file) as fp:
    soup = BeautifulSoup(fp,"html.parser")

found = soup.find("div", {"id": "content"})
found.replace_with(data)

Когда я печатаю found, я получаю правильный формат:

>>> print(found)
<div id="content">stuff</div>

index_file содержание ниже:

 <!DOCTYPE html>
 <head>
    Apples 
 </head>
 <body>

   <div id="page">
    This is the Id of the page

  <div id="main">

     <div id="content">
       stuff here
     </div>
  </div>
 footer should go here
 </div>
</body>
</html>

1 Ответ

0 голосов
/ 27 августа 2018

Объект found не является строкой Python, это Tag, который просто имеет хорошее представление строки. Вы можете проверить это, выполнив

type(found)

A Tag является частью иерархии объектов, которую Beautiful Soup создает для того, чтобы вы могли взаимодействовать с HTML. Еще один такой объект - NavigableString. NavigableString очень похоже на строку, но может содержать только то, что входит в контентную часть HTML.

Когда вы делаете

found.replace_with('<div id="content">stuff here</div>')

вы просите заменить Tag на NavigableString, содержащий этот буквальный текст. Единственный способ для HTML, чтобы иметь возможность отображать эту строку, это экранировать все угловые скобки, как это происходит.

Вместо этого беспорядка вы, вероятно, захотите оставить свой Tag и заменить только его содержимое:

found.string.replace_with('stuff here')

Обратите внимание, что правильная замена не пытается перезаписать теги.

Когда вы делаете found.replace_with(...), объект, на который ссылается имя found, заменяется в родительской иерархии. Однако имя found продолжает указывать на тот же устаревший объект, что и раньше. Вот почему печать soup показывает обновление, а печать found - нет.

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