web-dev-qa-db-fra.com

python Table d'analyse BeautifulSoup

J'apprends python requests et BeautifulSoup. Pour un exercice, j'ai choisi d'écrire un analyseur syntaxique rapide de tickets de stationnement à New York. Je suis en mesure d'obtenir une réponse HTML qui est assez moche. Je dois prendre le lineItemsTable et analyser tous les tickets.

Vous pouvez reproduire la page en allant ici: https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch et en entrant un NY plaque 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

Quelqu'un peut-il m'aider s'il vous plaît? La simple recherche de tous les tr ne me mène nulle part.

66
Cmag

Voici:

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

Cela vous donne:

[ [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:']
]

Quelques choses à noter:

  • La dernière ligne de la sortie ci-dessus, le montant du paiement ne fait pas partie du tableau, mais c'est ainsi que le tableau est présenté. Vous pouvez le filtrer en vérifiant si la longueur de la liste est inférieure à 7.
  • La dernière colonne de chaque ligne devra être traitée séparément car il s'agit d'une zone de texte de saisie.
129
shaktimaan

Résolu, voici comment vous analysez leurs résultats 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