2015-07-05 3 views
3

Я пытаюсь вставить строку html в объект BeautifulSoup. Если я вставляю его напрямую, bs4 санирует html. Если взять строку html и создать суп из нее, и вставить, что у меня проблемы с использованием функции find. This post thread на SO предполагает, что вставка объектов BeautifulSoup может вызвать проблемы. Я использую решение этой должности и воссоздаю суп каждый раз, когда я вставляю.Вставить строку html в объект BeautifulSoup

Но, конечно, есть лучший способ вставить строку html в суп.

EDIT: Я добавить код в качестве примера того, что проблема

from bs4 import BeautifulSoup 

mainSoup = BeautifulSoup(""" 
<html> 
    <div class='first'></div> 
    <div class='second'></div> 
</html> 
""") 

extraSoup = BeautifulSoup('<span class="first-content"></span>') 

tag = mainSoup.find(class_='first') 
tag.insert(1, extraSoup) 

print mainSoup.find(class_='second') 
# prints None 
+0

Можете ли вы показать использование своего 'html' и ожидаемого результата? – styvane

+0

@ user3100115 Я добавил некоторый довольно прямой код в качестве примера, если это поможет. – Preom

ответ

4

Простейшее образом, если у вас уже есть HTML строку, чтобы вставить другой объект BeautifulSoup.

from bs4 import BeautifulSoup 

doc = ''' 
<div> 
test1 
</div> 
''' 

soup = BeautifulSoup(doc, 'html.parser') 

soup.div.append(BeautifulSoup('<div>insert1</div>', 'html.parser')) 

print soup.prettify() 

Выход:

<div> 
test1 
<div> 
insert1 
</div> 
</div> 

Update 1

Как насчет этого? Идея заключается в использовании BeautifulSoup для создания правильного узла AST (тег span). Похоже, это устраняет проблему «Нет».

import bs4 
from bs4 import BeautifulSoup 

mainSoup = BeautifulSoup(""" 
<html> 
    <div class='first'></div> 
    <div class='second'></div> 
</html> 
""", 'html.parser') 

extraSoup = BeautifulSoup('<span class="first-content"></span>', 'html.parser') 
tag = mainSoup.find(class_='first') 
tag.insert(1, extraSoup.span) 

print mainSoup.find(class_='second') 

Выход:

<div class="second"></div> 
+0

Явным образом объявляю парсер, что отличает? – Preom

+0

На самом деле, мы не только объявляем синтаксический анализатор, мы создаем совершенно новое проанализированное дерево для вставленного html. BeautifulSoup (x) не является маркером, он фактически выполняет синтаксический анализ, который приводит к суп-объекту. –

+1

Извините, если это грубо, вы полностью прочитали мой пост? Я уже упоминал, что я уже пытался вставить объект BeautifulSoup и что он вызывает проблемы. Это почему я искал лучший метод. – Preom

3

Лучший способ сделать это путем создания нового тега span и вставить его в mainSoup. Это метод .new_tag.

In [34]: from bs4 import BeautifulSoup 

In [35]: mainSoup = BeautifulSoup(""" 
    ....: <html> 
    ....:  <div class='first'></div> 
    ....:  <div class='second'></div> 
    ....: </html> 
    ....: """) 

In [36]: tag = mainSoup.new_tag('span') 

In [37]: tag.attrs['class'] = 'first-content' 

In [38]: mainSoup.insert(1, tag) 

In [39]: print(mainSoup.find(class_='second')) 
<div class="second"></div>