문제
나는 일부 화면 스크래핑 소프트웨어를 작업하고 있으며 아름다운 수프로 문제가 발생했습니다. 파이썬 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!'
도움이되기를 바랍니다.
제휴하지 않습니다 StackOverflow