2014-11-18 6 views
2

Можно ли установить разметку как содержимое тега (сродни настройке innerHtml в JavaScript)?Добавить строку разметки в тег в BeautifulSoup

Ради примера, скажем, я хочу добавить 10 <a> элементов в <div>, но они разделены запятой:

soup = BeautifulSoup(<<some document here>>) 

a_tags = ["<a>1</a>", "<a>2</a>", ...] # list of strings 
div = soup.new_tag("div") 
a_str = ",".join(a_tags) 

Использование div.append(a_str) ускользает < и > в &lt; и &gt;, так Я в конечном итоге с

<div> &lt;a1&gt; 1 &lt;/a&gt; ... </div> 

BeautifulSoup(a_str) оберток этого в <html>, и я вижу, получение дерево из него как неэлегантный хак.

Что делать?

ответ

6

Вам нужно создать BeautifulSoup объект из ваших HTML строки, содержащие ссылки:

from bs4 import BeautifulSoup 

soup = BeautifulSoup() 
div = soup.new_tag('div') 

a_tags = ["<a>1</a>", "<a>2</a>", "<a>3</a>", "<a>4</a>", "<a>5</a>"] 
a_str = ",".join(a_tags) 

div.append(BeautifulSoup(a_str, 'html.parser')) 

soup.append(div) 
print soup 

Печать:

<div><a>1</a>,<a>2</a>,<a>3</a>,<a>4</a>,<a>5</a></div> 

Альтернативное решение:

Для каждой ссылки создают Tag и добавьте его в.. Кроме того, добавьте через запятую после каждой ссылки, кроме последнего:

from bs4 import BeautifulSoup 

soup = BeautifulSoup() 
div = soup.new_tag('div') 

for x in xrange(1, 6): 
    link = soup.new_tag('a') 
    link.string = str(x) 
    div.append(link) 

    # do not append comma after the last element 
    if x != 6: 
     div.append(",") 

soup.append(div) 

print soup 

Печати:

<div><a>1</a>,<a>2</a>,<a>3</a>,<a>4</a>,<a>5</a></div> 
+0

Спасибо! Это одно из решений, но в идеале для выполнения этой задачи мне нужен короткий однострочный вкладыш. И в этот момент я нахожу что-то вроде «BeautifulSoup» («

"+a_str+"
») .div', чтобы быть красивым. Неудивительно, что нет более простого способа создать _just_ тег из разметки. – Konrad

+0

@JanParowka Я отредактировал ответ и включил 2 варианта. Загрузка тега из строки с помощью 'BeautifulSoup (...)' является самым простым вариантом. – alecxe

+0

Да, прокомментировал перед вашим редактированием. Это то, что я искал. Должно быть, он пропустил его в документе, так как я ожидал, что он будет в модифицирующем дереве. Потрясающие! – Konrad

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