1

나는 http://www.co.jefferson.co.us/ats/displaygeneral.do?sch=000104 을 긁어하고 "소유자 이름 (들)"을 얻기 위해 노력하고 나는 작품을 가지고 있지만 정말 추악하고 무엇 없습니다 나는 확신, 그래서 더 나은 찾고 있어요 최고의 방법. 나는 그들을 통해 보았지만 나에게 도움이 대답을 찾을 수 없습니다,BeautifulSoup로 얻을 값은

soup = BeautifulSoup(url_opener.open(url))    
x = soup('table', text = re.compile("Owner Name")) 
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next 

관련 HTML은

<td valign="top"> 
    <table border="1" cellpadding="1" cellspacing="0" align="right"> 
    <tbody><tr class="tableheaders"> 
    <td>Owner Name(s)</td> 
    </tr> 

    <tr> 

    <td>PILCHER DONALD L       </td> 
    </tr> 

    </tbody></table> 
</td> 

와우이다, BeautifulSoup로에 대한 많은 질문이있다 : 여기 내가 가진 무엇 잘하면이 질문이 중복되지 않습니다

답변

5

(편집는 : 분명히 HTML 영업 이익은 거짓말을 게시 - 그가 그 HTML을 포함하여 지점했다하더라도, 찾아 할 tbody 태그 사실이 없다 그래서, 사용 변경. tbody 대신 table).

원하는 테이블 행이 여러 개있을 수 있습니다 (예 : 제공 한 형제 URL의 형제 URL, 마지막 숫자 4, 5로 변경됨). 다음과 같은 루프를 제안합니다.

# locate the table containing a cell with the given text 
owner = re.compile('Owner Name') 
cell = soup.find(text=owner).parent 
while cell.name != 'table': cell = cell.parent 
# print all non-empty strings in the table (except for the given text) 
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)): 
    print x 

페이지 구조의 사소한 변경에 대해 매우 견고합니다. 관심있는 셀을 찾았 으면 테이블 태그가 발견 될 때까지 부모를 루프 한 다음 해당 테이블 내에서 비어 있지 않은 모든 탐색 가능한 문자열을 또는 공백 만). owner 헤더는 제외됩니다.

+0

덕분에, 나는이 문제를 해결하기 위해 더 나은 방법이 있나요 오류 cell.name가 내가 시도를 사용하지 진짜 잘 알고 시도를 사용할 수 있습니다 생각에는 속성 이름이없는거야? – Vincent

+0

당신이 준 URL에는 내 코드가없는 오류가 없습니다 (내 코드의 두 번째 줄에'.parent'가 있습니다 : 탐색 가능한 문자열에서 _does_에 이름이있는) 위로 이동하는 것입니다. 내 대답에 올린 코드에 정확한 URL에는 어떤 문제가 있습니까? –

+0

방금이 URL을 확인했으며 ''태그가 없습니다. 난 당신이 "소유자 이름 (들)"테이블 컬럼 헤더를 찾아보고 그 테이블의 모든 행에있는 값을 읽어야 할 것이라고 생각합니다. – PaulMcG

1

이것은 약간 개선되었지만 세 부모를 없애는 방법을 찾지 못했습니다.

x[0].parent.parent.parent.findAll('td')[1].string 
3

이것은 Beautifulsoup 토론 그룹의 Aaron DeVore의 대답입니다. 그것은 저에게 잘 맞습니다. 당신은 그들의 무리를하고 있다면 Tag.string

soup = BeautifulSoup(...) 
label = soup.find(text="Owner Name(s)") 

요구는 실제 이름 문자열

name = label.findNext('td').string 

에 도착, 당신도 지능형리스트에 갈 수 있습니다. 답에 대한

names = [unicode(label.findNext('td').string) for label in 
soup.findAll(text="Owner Name(s)")]