2016-11-25 17 views
1

robobrowserでフォームの提出を行った後にウェブサイトを解析しようとするのが初めてです。正しいデータが返されます(print(browser.parsed)を実行すると表示されますが)解析中に問題が発生しています。 Webページのソースコードの関連部分は次のようになります。私はrobobrowserとbeautifulsoupを使ってWebページを解析する

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>] 

の代わりJONES、JOHN。

私は、関連するデータを取得することができた唯一の方法はやっている:

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

関連する問題