Ошибка с экстрактом Beautiful Soup () - PullRequest
0 голосов
/ 13 мая 2009

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

Мне нужно удалить тег <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

Я неправильно понимаю функцию извлечения или это ошибка в Beautiful Soup?

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

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

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 голосов
/ 22 апреля 2016

У меня такая же проблема. Я не знаю почему, но я думаю, что это связано с пустыми элементами, созданными 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' не имеет атрибута '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!'

Надеюсь, это поможет.

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