문제

나는 일부 화면 스크래핑 소프트웨어를 작업하고 있으며 아름다운 수프로 문제가 발생했습니다. 파이썬 2.4.3과 아름다운 수프 3.0.7a를 사용하고 있습니다.

나는 an을 제거해야한다 <hr> 태그이지만 여러 가지 속성이있을 수 있으므로 간단한 대체 () 호출은 절단되지 않습니다.

다음 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

추출물 기능을 오해하고 있습니까, 아니면 아름다운 수프가있는 버그입니까?

도움이 되었습니까?

해결책

버그 일 수 있습니다. 그러나 다행히도 당신을 위해 문자열을 얻는 또 다른 방법이 있습니다.

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

다른 팁

나는 같은 문제가 있습니다. 나는 이유를 모르지만 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!'

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top