2017-12-14 10 views
1

와 부모 요소의 첫 번째 자식을 얻기 나는 다음과 같은 HTML이 있습니다파이썬 - BeautifulSoup4

<table id="mytable"> 
    <tr role="row"> 
     <td>abc1</td> 
     <td>abc2</td> 
     <td>abc3</td> 
     <td class="hm">Data1</td> 
     <td>Data2</td> 
     <td class="hm">no</td> 
     <td class="hx">yes</td> 
     <td class="hm">Updated</td> 
    </tr> 
    <tr role="row"> 
     <td>def1</td> 
     <td>def2</td> 
     <td>def3</td> 
     <td class="hm">Data3</td> 
     <td>Data4</td> 
     <td class="hm">no</td> 
     <td class="hx">no</td> 
     <td class="hm">Updated</td> 
    </tr> 
    <tr role="row"> 
     <td>hij1</td> 
     <td>hij2</td> 
     <td>hij3</td> 
     <td class="hm">Data5</td> 
     <td>Data6</td> 
     <td class="hm">no</td> 
     <td class="hx">no</td> 
     <td class="hm">Updated</td> 
    </tr> 
    <tr role="row"> 
     <td>klm1</td> 
     <td>klm2</td> 
     <td>klm3</td> 
     <td class="hm">Data7</td> 
     <td>Data8</td> 
     <td class="hm">no</td> 
     <td class="hx">yes</td> 
     <td class="hm">Updated</td> 
    </tr> 
</table> 

나는 아이 <td>이있는 곳을 찾기 위해 다음을 수행하고 있으므로이 <tr> 태그의 배수가 있습니다 class="hx"와 태그 yes의 텍스트 :

if (Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'})): 
    print "Found 'yes'" 

는하지만 발견되는 <tr>의 첫 번째 <td> 태그에 관심이 있어요. 나는 다음을 수행했지만, 작동하지 않는 것 : 또는

print Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'}).parent.find('td')[0].text 

, 다음 작품 그러나 나는 확실하지 않다 특히,이 일을 정말 쉬었 방법처럼 보인다 얼마나 많은 <td> 태그 두 사람 사이에 존재합니다 :

print Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'}).previousSibling.previousSibling.previousSibling.previousSibling.previousSibling.previousSibling.text 

더 좋은 방법이 있습니까? 내가 놓친 게 있니? 두 번째 인쇄 변화에

+1

던질 것인지? – RomanPerekhrest

+0

올바른, 그래서'.previousSibling'의 모든 작업으로 두번째'print'하지만, 명시된 바와 같이, 얼마나 많은 다른''태그가 내가 찾은 태그와 첫 번째 태그 사이에 있을지 확신하지 못합니다. – rjbogz

+0

물론, 방금 업데이트했지만, find ('td', text = 'yes', attrs = { 'class': 'hx'})'의 첫 번째 인스턴스를 원한다. 그래서'abc1'과'klm1'이 아니라'abc1' 만 출력해야합니다. – rjbogz

답변

3

:

find('td')[0] 

에 :

find('td') 

찾기가 첫 번째 요소, 인덱스 너무 필요가 없습니다를 반환합니다.

from bs4 import BeautifulSoup 

text = """ 
<html><head><title>Foo</title></head> 
<body> 
<table id="mytable"> 
<tr role="row"> 
    <td>Col1</td> 
    <td>Col2</td> 
    <td>Col3</td> 
    <td class="hm">Data1</td> 
    <td>Data2</td> 
    <td class="hm">no</td> 
    <td class="hx">yes</td> 
    <td class="hm">Updated</td> 
</tr> 
<table> 
""" 
Soup = BeautifulSoup(text, 'html.parser') 

# Will raise error 
# print Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'}).find_parent().find('td')[0].text 

print Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'}).find_parent().find('td').text 

편집 find_all('td')에 두 번째 열 변화를 find('td')를 얻으려면. 이 목록을 반환합니다, 그래서 당신은 할 수 있습니다 : 분명히

td_data = Soup.find('table', {'id' : 'mytable'}).find('td', text='yes', attrs={'class' : 'hx'}).find_parent().find_all('td') 
print td_data[0].text # 1st column 
print td_data[1].text # 2nd column 

, len(td_data) - 1보다 큰 당신 지수는 당신이`Col1` 마지막에 인쇄 할 그래서 IndexError

+0

그러면 두번째 컬럼을 얻는 방법은 무엇입니까? 말하자면, 나는'abc1'과'abc2' 둘 다 필요합니다. 편집 :'find ('td'). nextSibling'은'abc2'에 대한 트릭을하는 것처럼 보입니다. – rjbogz

+0

편집을 참조하십시오. 'find_all'로 변경하면 각 열을 인덱스 할 수 있습니다. – Harpal

+0

죄송합니다. 코드가 잘못되었습니다. 편집하기 전의 예에서, 이제는 고정되어 있습니다 – Harpal

관련 문제