2014-05-23 2 views
4

soup.find_all은 단일 태그의 모든 발생에 대해 BeautifulSoup 문서를 검색합니다. 중첩 태그의 특정 패턴을 검색 할 수있는 방법이 있습니까?아름다운 스프 : 중첩 패턴을 찾으십니까?

예를 들어,이 패턴의 모든 항목을 검색하고 싶습니다 :

<div class="separator"> 
    <a> 
    <img /> 
    </a> 
</div> 

답변

1

는 패턴을 찾을 수있는 여러 가지 방법이 있지만 가장 쉬운 방법은 하나는 CSS selector 사용하는 것입니다 :

for img in soup.select('div.separator > a > img'): 
    print img # or img.parent.parent to get the "div" 

데모 :

>>> from bs4 import BeautifulSoup 
>>> data = """ 
... <div> 
...  <div class="separator"> 
...  <a> 
...   <img src="test1"/> 
...  </a> 
...  </div> 
... 
...  <div class="separator"> 
...  <a> 
...   <img src="test2"/> 
...  </a> 
...  </div> 
... 
...  <div>test3</div> 
... 
...  <div> 
...   <a>test4</a> 
...  </div> 
... </div> 
... """ 
>>> soup = BeautifulSoup(data) 
>>> 
>>> for img in soup.select('div.separator > a > img'): 
...  print img.get('src') 
... 
test1 
test2 

내가 엄밀히 말하면, 이해 마십시오 솔루션을 div에 하나 이상의 a 자식이 있거나 a 태그 내부에 img 태그를 제외한 다른 요소가있는 경우 작동하지 않습니다. 이 경우 추가 점검을 통해 솔루션을 개선 할 수 있습니다 (필요한 경우 해답을 편집합니다).

+0

이것은 완벽합니다. 감사합니다! 내 특정 응용 프로그램에서는 img.parent를 사용하여 동봉 된 을 수정합니다. –

1

체크 아웃 docs의이 부분을. 다음과 같은 함수를 원할 것입니다 :

def nested_img(div): 
    child = div.contents[0] 
    return child.name == "a" and child.contents[0].name == "img" 

soup.find_all("div", nested_img) 

P .: 이것은 테스트되지 않았습니다.

관련 문제