web-dev-qa-db-ja.com

python BeautifulSoup解析テーブル

私はpython requestsとBeautifulSoupを学んでいます。演習のために、簡単なNYC駐車チケットパーサーを作成することにしました。かなりresponseいHTML応答を取得できます。 lineItemsTableを取得して、すべてのチケットを解析する必要があります。

https://paydirect.link2gov.com/NYCParking-Plate/ItemSearchにアクセスしてNYプレートT630134Cを入力すると、ページを再現できます。

soup = BeautifulSoup(plateRequest.text)
#print(soup.prettify())
#print soup.find_all('tr')

table = soup.find("table", { "class" : "lineItemsTable" })
for row in table.findAll("tr"):
    cells = row.findAll("td")
    print cells

誰かが私を助けてくれますか?すべてのtrを簡単に探しても、どこにも行きません。

66
Cmag

どうぞ:

data = []
table = soup.find('table', attrs={'class':'lineItemsTable'})
table_body = table.find('tbody')

rows = table_body.find_all('tr')
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele]) # Get rid of empty values

これにより、次のことが可能になります。

[ [u'1359711259', u'SRF', u'08/05/2013', u'5310 4 AVE', u'K', u'19', u'125.00', u'$'], 
  [u'7086775850', u'PAS', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'125.00', u'$'], 
  [u'7355010165', u'OMT', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'145.00', u'$'], 
  [u'4002488755', u'OMT', u'02/12/2014', u'NB 1ST AVE @ E 23RD ST', u'5', u'115.00', u'$'], 
  [u'7913806837', u'OMT', u'03/03/2014', u'5015 4th Ave', u'K', u'46', u'115.00', u'$'], 
  [u'5080015366', u'OMT', u'03/10/2014', u'EB 65TH ST @ 16TH AV E', u'7', u'50.00', u'$'], 
  [u'7208770670', u'OMT', u'04/08/2014', u'333 15th St', u'K', u'70', u'65.00', u'$'], 
  [u'$0.00\n\n\nPayment Amount:']
]

注意すべき点:

  • 上記の出力の最後の行である支払い金額はテーブルの一部ではありませんが、それがテーブルのレイアウト方法です。リストの長さが7未満であるかどうかをチェックすることで、フィルターで除外できます。
  • すべての行の最後の列は入力テキストボックスであるため、個別に処理する必要があります。
129
shaktimaan

解決、これはあなたのHTML結果を解析する方法です:

table = soup.find("table", { "class" : "lineItemsTable" })
for row in table.findAll("tr"):
    cells = row.findAll("td")
    if len(cells) == 9:
        summons = cells[1].find(text=True)
        plateType = cells[2].find(text=True)
        vDate = cells[3].find(text=True)
        location = cells[4].find(text=True)
        borough = cells[5].find(text=True)
        vCode = cells[6].find(text=True)
        amount = cells[7].find(text=True)
        print amount
21
Cmag