2009-05-12 2 views
0

Я работаю над программным обеспечением для очистки экрана и сталкиваюсь с проблемой с Beautiful Soup. Я использую python 2.4.3 и Beautiful Soup 3.0.7a.Ошибка с экстрактом Beautiful Soup()

Мне нужно удалить тег <hr>, но он может иметь много разных атрибутов, поэтому простой вызов replace() не будет вырезать его.

Учитывая следующий HTML:

<h1>foo</h1> 
<h2><hr/>bar</h2> 

И следующий код:

soup = BeautifulSoup(string) 

bad_tags = soup.findAll('hr'); 
[tag.extract() for tag in bad_tags] 

for i in soup.findAll(['h1', 'h2']): 
    print i 
    print i.string 

Выход:

<h1>foo</h1> 
foo 
<h2>bar</h2> 
None 

ли я недопонимание функцию экстракта, или это ошибка с красивым супом?

ответ

2

Это может быть ошибка. Но, к счастью для вас, есть еще один способ получить строку:

from BeautifulSoup import BeautifulSoup 

string = \ 
"""<h1>foo</h1> 
<h2><hr/>bar</h2>""" 

soup = BeautifulSoup(string) 

bad_tags = soup.findAll('hr'); 
[tag.extract() for tag in bad_tags] 

for i in soup.findAll(['h1', 'h2']): 
    print i, i.next 

# <h1>foo</h1> foo 
# <h2>bar</h2> bar 
0

У меня такая же проблема. Я не знаю почему, но я предполагаю, что это связано с пустым элементом, созданным BS.

Например, если у меня есть следующий код:

from bs4 import BeautifulSoup 

html ='   \ 
<a>    \ 
    <b test="help">   \ 
     hello there! \ 
     <d>  \ 
     now what? \ 
     </d> \ 
     <e>  \ 
      <f>  \ 
      </f> \ 
     </e> \ 
    </b>  \ 
    <c>   \ 
    </c>  \ 
</a>   \ 
' 

soup = BeautifulSoup(html,'lxml') 
#print(soup.find('b').attrs) 

print(soup.find('b').contents) 

t = soup.find('b').findAll() 
#t.reverse() 
for c in t: 
    gb = c.extract() 

print(soup.find('b').contents) 

soup.find('b').text.strip() 

я получил следующее сообщение об ошибке:

'NoneType' object has no attribute 'next_element'

На первой печати я получил:

>>> print(soup.find('b').contents) 
[u' ', <d> </d>, u' ', <e> <f> </f> </e>, u' '] 

, а с второй я получил:

>>> print(soup.find('b').contents) 
[u' ', u' ', u' '] 

Я уверен, что это пустой элемент в середине, создающий проблему.

Обходной я нашел это просто воссоздать суп:

soup = BeautifulSoup(str(soup)) 
soup.find('b').text.strip() 

Теперь печатает:

>>> soup.find('b').text.strip() 
u'hello there!' 

Я надеюсь, что помогает.