2016-07-02 1 views
1

내가 이러한 코드 가지고Beautifulsoup로 파이썬에서 또 다른 특정 div 클래스를 포함하는 div 클래스를 얻는 방법은 무엇입니까?

<div class = first> 
    <div class = second> 
    <div class = fourth> 
<div class = first> 
    <div class = second> 
    <div class = third> 
<div class = first> 
    <div class = second> 
    <div class = fourth> 

DIV 번째의 내용이 제 DIV 상이한을하지만 DIV 셋째는 첫째 자리 동일한 DIV에있는 DIV 번째의 정보가 필요하다. 그래서 div 3 분의 1은 정확한 div 초를 식별하는 데 필요합니다.

보다 정확하게하려면 div.first에 div.third가 포함 된 경우이 요소의 특정 div.second (또는 특정 div 먼저)를 변수에 저장합니다 (그것에서 몇몇 원본을 붙잡 으십시오).

find_all 및 부모 또는 자식 작업을 시도했지만이 문제를 해결할 수 없었습니다. 도움이 될 것입니다.

업데이트 (예) : 비행 검색 사이트와 예 :

<div class = booking class> 
    <div class = price> 
    <div class = non refundable> 

<div class = booking class> 
    <div class = price> 
    <div class = refundable> 

<div class = booking class> 
    <div class = price> 
    <div class = non refundable> 

내가 사업부 클래스 = 가격의 컨텐츠를 필요로 할 때 DIV 클래스 = 환불. 희망 사항을 통해보다 명확하게 이해할 수 있습니다. 당신이 말할 때 나는 가정

+1

... 무엇? 덜 추상적 인 예를 들어 줄 수 있습니까? – jonrsharpe

답변

0

당신이 가격 DIV이 환불의 부모가 그렇게 환불 된 div를 찾아 부모 클래스 이름 가격 사업부가 있는지 의미 것을 포함, 당신은 무엇을 당신이 필요합니다

HTML = "" "

<div class ="booking class"> 
    <div class="price"> 
     <div class="refundable"></div> 
    </div> 

<div class = "booking class"> 
    <div class="price"> 
     <div class="non refundable"></div> 
    </div> 
</div>""" 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html, "lxml") 


for div in soup.find_all(lambda tag: tag.name == "div" and tag.get('class') == ['refundable']): 
    par = div.parent 
    if par and par.name == "div" and par["class"] == ["price"]: 
     print(par) 

이러한 경우 형제 :

html = """ 
<div class ="booking class"> 
    <div class="price"> </div> 
    <div class="refundable"></div> 
</div> 

<div class ="booking class"> 
    <div class="price"> </div> 
    <div class="non refundable"></div> 
</div> 
<div class ="booking class"> 
    <div class="price"> </div> 
    <div class="non refundable"></div> 
</div> 

""" 

그리고 가격이 항상 사용 앞에 오는이을 find_previous_sibling :

for div in soup.find_all(lambda tag: tag.name == "div" and tag.get('class') == ['refundable']): 
    sib = div.find_previous_sibling("div", "price") 
    if sib: 
     print(div.parent) 

또는 뒤에 및/또는 후 확인 :

for div in soup.find_all(lambda tag: tag.name == "div" and tag.get('class') == ['refundable']): 
    sib = div.find_previous_sibling("div", "price") or div.find_next_sibling("div", "price") 
    if sib: 
     print(div.parent)  

사업부 할 수있는 경우를 학부모 내부 어디든 있습니다.

for div in soup.find_all(lambda tag: tag.name == "div" and tag.get('class') == ['refundable']): 
    sib = div.parent.find("div", "price") 
    if sib: 
     print(div.parent) 
+0

대단히 감사합니다! 가격 div가 환불 가능한 div의 형제 (부모가 아님)이지만, 함께 작업 할 수 있습니다. 두 형제 자매의 부모를 필터링 (가격 및 환불)하기 때문에 나는 하나의 필터에 div 클래스를 모두 가지고 있으며, 필요한 루프를 찾기 위해 다른 for 루프를 사용할 수 있습니다. 놀랄 만한! 추신 형제와도 잘 어울리는 지 아십니까? 왜냐하면 나는 성공하지 않고 par = div.sibling을 시도했기 때문이다. – Kimsbrand

+0

@Kimsbrand, 몇 가지 예제를 추가했습니다 –

+0

정말 고마워요! – Kimsbrand

관련 문제