2016-11-25 1 views
1

robobrowser를 사용하여 양식 제출을 수행 한 후 웹 사이트를 구문 분석하려고 할 때 webscraping을 처음 사용했습니다. 나는 올바른 데이터를 다시 얻는다. (필자는 그것을 볼 수있다 : print (browser.parsed)) 문제를 파싱하고있다. 내가robobrowser 및 beautifulsoup을 사용하여 웹 페이지 구문 분석

in: browser.select('#t1b") 

을 할 경우

<div id="ii"> 
<tr> 
    <td scope="row" id="t1a"> ID (ID Number)</a></td> 
    <td headers="t1a">1234567 &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1b">Participant Name</td> 
    <td headers="t1b">JONES, JOHN       &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1c">Sex</td> 
    <td headers="t1c">MALE &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1d">Date of Birth</td> 
    <td headers="t1d">11/25/2016 &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1e">Race/Ethnicity</a></td> 
    <td headers="t1e">White     &nbsp;</td> 
</tr> 

내가 얻을 : 웹 페이지의 소스 코드의 관련 부분은 다음과 같습니다 대신 존스, 존의

out: [<td id="t1b" scope="row">Inmate Name</td>] 

.

내가 관련 데이터를 얻을 수 있었던 유일한 방법은하고있다 :

browser.select('tr') 

이 내가 텍스트를 검색 할 변환 할 수 있습니다 각 'TR'로 (29)의 각각의 목록을 반환 관련 정보.

x = browser.select('#ii') 
soup = BeautifulSoup(x[0].text, "html.parser") 

을하지만 모든 태그/ID를 잃고 그래서 그것을 내에서 검색하는 방법을 알아낼 수 없습니다

나는 또한 BeautifulSoup로 객체를 생성 시도했습니다.

'tr'을 사용하여 각 요소를 반복하는 쉬운 방법이 있습니까? 반복적으로 문자열 변수로 변환하고 검색하는 것을 반대하는 레이블이 아닌 실제 데이터를 얻으시겠습니까?

감사

답변

0

모든 "라벨"td 요소가 딕셔너리에 next td sibling value 수집 결과를 얻을 수 가져 오기 :

from pprint import pprint 
from bs4 import BeautifulSoup 

data = """ 
<table> 
    <tr> 
     <td scope="row" id="t1a"> ID (ID Number)</a></td> 
     <td headers="t1a">1234567 &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1b">Participant Name</td> 
     <td headers="t1b">JONES, JOHN       &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1c">Sex</td> 
     <td headers="t1c">MALE &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1d">Date of Birth</td> 
     <td headers="t1d">11/25/2016 &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1e">Race/Ethnicity</a></td> 
     <td headers="t1e">White     &nbsp;</td> 
    </tr> 
</table> 
""" 

soup = BeautifulSoup(data, 'html5lib') 

data = { 
    label.get_text(strip=True): label.find_next_sibling("td").get_text(strip=True) 
    for label in soup.select("tr > td[scope=row]") 
} 
pprint(data) 

인쇄 :

{'Date of Birth': '11/25/2016', 
'ID (ID Number)': '1234567', 
'Participant Name': 'JONES, JOHN', 
'Race/Ethnicity': 'White', 
'Sex': 'MALE'} 
+0

놀라운 - 정말 고마워요! – MikeD

관련 문제