1

私は、robobrowserでフォームを送信した後、ウェブサイトを解析しようとするウェブスクレイピングが初めてです。正しいデータが返されます (実行すると表示できます: print(browser.parsed)) が、解析に問題があります。Web ページのソース コードの関連部分は次のようになります。

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

私が行った場合

in: browser.select('#t1b")

私は得る:

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

JONES、JOHNの代わりに。

関連データを取得できた唯一の方法は、次のことです。

browser.select('tr')

これにより、テキストに変換して関連情報を検索できる各 'tr' を含む 29 のそれぞれのリストが返されます。

BeautifulSoup オブジェクトの作成も試みました。

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

しかし、すべてのタグ/IDが失われるため、その中を検索する方法がわかりません。

文字列変数に繰り返し変換して検索するのとは対照的に、「tr」を使用して各要素をループし、ラベルではなく実際のデータを取得する簡単な方法はありますか?

ありがとう

4

1 に答える 1

0

すべての「ラベル」td要素を取得し、次のtd兄弟値を取得して、結果を辞書に収集します。

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'}
于 2016-11-25T18:55:09.780 に答える