[python] regex problemen met newline

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 12:28
ben best wel nieuw in python en ik probeer een oud tooltje te fixen. Via python wordt een html string geparsed om netjes in een database terecht te komen. Recent is er iets op de site gewijzigd waardoor het niet meer werkt en ik probeer dit weer te repareren.

HTML regel die wordt geparsed (meerdere <TR> rijen)
code:
1
2
tr class="accountTransactionRowDefault"><td class="account-padding"></td><td class="account-transaction">382296515458428</td><td class="account-date">Jan-31-11 23:10</td><td class="account-description">Bedrijf X
                            <br /></td><td class="account-debit"></td><td class="account-credit">€166.00<span id="form:transactionSearchResults:0:not_credit_id"></span></td><td class="account-status"><span class="accountStatePositive">Accepted</span></td></tr>

De newline na bedrijf X zorgt ervoor dat de bestaande regex niet goed wil werken.

Mijn regexcode ziet er als volgt uit:
code:
1
2
3
4
5
<td\s+class\s*=\s*"account-date">\s*(?P<date>.*?)\s*</td>.*?
<td\s+class\s*=\s*"account-description">(?P<description>.*?)<br /></td>.*?
<td\s+class\s*=\s*"account-debit">(?P<debit>.*?).*?</td>
<td\s+class\s*=\s*"account-credit">(?P<credit>.*?).*?</td>
<td\s+class\s*=\s*"account-status"><span\s+class\s*=\s*"accountState.*?">(.*?)</span></td>


Deze werkt bijna goed als er geen newline in de regel zich bevindt. Enige probleem is dat als ik een findall gebruik, hij de €166.00 niet goed terug weet te vinden?? Een FindITER doet dit wel. Tweede grotere probleem nu is dat bij een newline hij helemaal niks vind.

Iemand een idee? Enige wat ik probeer is op een goede manier de tabelcel informatie te strippen:
Date: Jan-31-11 23:10
Description: Bedrijf X (met/zonder newline maakt niet veel uit)
Debit: leeg
Credit: €166.00
status: Accepted

Ben ik op de goeie weg met mijn regexs of kan ik beter helemaal bij de basis beginnen?

Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 09-09 15:21
Heeft Python geen HTMLParser beschikbaar? Het lijkt me dat dat handiger werkt dan met reguliere expressies.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
De "." matcht standaard geen newlines. Hiervoor moet je de DOTALL flag meegeven:
Python:
1
2
3
4
import re
text = "a\nb"
for m in re.finditer(r"a.b", text, re.DOTALL): 
    print m.start(), m.end()

http://docs.python.org/library/re.html#re.DOTALL

[ Voor 10% gewijzigd door user109731 op 01-02-2011 15:25 ]


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Of de multiline-flag, welke zinniger is in deze situatie.

En oh ja, lees dit ook even.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
GX schreef op dinsdag 01 februari 2011 @ 15:33:
Of de multiline-flag, welke zinniger is in deze situatie.
Waarom? Dat maakt alleen verschil voor ^ en $ volgens de documentatie, beide zie ik niet in de code van de TS.

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Of dit..

On track


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 12:28
de dotall deed inderdaad wonderen!

nu zit ik met een laatste probleem bij uitlezen van bedragen:


de html code is dit :
<td class="account-credit">€166.00<span id="form:transactionSearchResults:0:not_credit_id"></span></td>
<td class="account-credit">€166.00<span id="form:transactionSearchResults:1:not_credit_id"></span></td>
<td class="account-credit">€166.00<span id="form:transactionSearchResults:2:not_credit_id"></span></td>

etc etc. dat hoogt zich dus op.

nou heb ik deze code om dan alleen het getal er uit te filteren:
<td\s+class\s*=\s*"account-debit">
(.*?)<span id="form:transactionSearchResults:.*?:not_credit_id"></span></td>

maar die doet niks. Hoe zorg ik hier voor? In de orginele code werd dit zo gedaan:

form:transactionSearchResults:\d+: maar dat lijkt niks te doen? Verder wil ik dat euro teken er ook meteen uittrekken, moet ook wel mogelijk zijn? Iets van deze code heb ik begrepen: \xE2\x82\xAC

Thanks voor de hint naar Beautiful Soup, maar wil liefst niet te veel in de code herschrijven!


EDIT
na wat puzzelen ben ik er achter waarom het mis gaat. In de HTML staat altijd eerst een Debit <TD> tag en dan een credit <TD> tag. Alleen bij het gevulde item kom dat stuk van <span id="form: etc etc></span> voor. Nu moet ik er voor zorgen dat die ook goed matched op het lege stuk. iets van een OR operator?

gaat doorpuzzelen!

[ Voor 13% gewijzigd door trekker22 op 01-02-2011 21:13 ]


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Ik zal je toch sterk adviseren van regular expressions af te stappen als je meer dan hele simpele dingen wil scrapen uit je (beroerde) HTML. Pak html5lib of desnoods beautifulsoup (verouderd), maar laat in godsnaam regex achterwege.
Pagina: 1