Modul 're' und regular expressio

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
newbie_needs_help
User
Beiträge: 18
Registriert: Donnerstag 18. Mai 2006, 08:33

Donnerstag 31. August 2006, 10:52

Hi,

ich bin ein Neuling was Python angeht und habe eine Frage.

Ich habe ein HTML Document aus dem ich verschiedene Links auslesen möchte. Ein kleiner Auszug:

Code: Alles auswählen

</TR>
<tr><th align=left>HRG</th>
<td><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+HRG" TARGET="resource window">15</A></TD>
<TD><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+HRG" TARGET="resource window">34</A></TD>
</TR>
<tr><th align=left>AKR1D1</th>
<td><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+AKR1D1" TARGET="resource window">2</A></TD>
<TD><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+AKR1D1" TARGET="resource window">0</A></TD>
</TR>
Mich interessieren drei Werte die in dem Link verschachtelt sind, ich habe sie mal mit HIER markiert

<td><A Href="http://www.ncbi.nlm.nih.gov/entrez/quer ... rm=[b]HIER[/b]+AND+HIER" TARGET="resource window">HIER</A></TD>

gibt es eine Möglichkeit diese Werte aus dem String zu lesen und sie in drei unterschiedlich Variabeln zu lesen?

In Perl gibt es die Möglichkeit diese Werte mit Hilfe der Klammer und $1 abzufangen. Gibt es eine ähnliche Lösung für dieses Problem.

Vielen Dank!
[img]http://www.danasoft.com/sig/newbieneedshelp.jpg[/img]
aquila
User
Beiträge: 13
Registriert: Mittwoch 22. März 2006, 01:40
Kontaktdaten:

Donnerstag 31. August 2006, 11:10

Ich würde es mit findall() machen:

Code: Alles auswählen

>>> links = re.findall("(?i)href=\"(.+?)\"", myHTML)
>>> links
['http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+HRG', '
http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+
HRG', 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+AK
R1D1', 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpress
ion+AND+AKR1D1']
>>> link1, link2, link3, link4 = links
>>> link1
'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+HRG'
Btw. sind Mehrfachposts unnötig.

Grüße,
aquila[/code]
[url=http://ephemeriden.com]Onlineplanetarium[/url] - [url=http://www.astrofind.net/]AstroFind - Astronomical Search Engine[/url] - [url=http://www.astrofind.net/discussion/]Astronomy Discussion[/url]
Benutzeravatar
newbie_needs_help
User
Beiträge: 18
Registriert: Donnerstag 18. Mai 2006, 08:33

Donnerstag 31. August 2006, 12:20

Hi aquila!

Das mit dem Mehrfachpost war keine Absicht, der Proxy hat mal wieder gesponnen und so habe ich die Form zweimal submittet :( Sorry

Deine Antwort hat mich sehr gefreut und es hat einen kleinen Moment gedauert bis ich durchgestiegen bin. Hehe was soll ich sagen bin ein 'native perler' der nun Spaß an Python gefunden hat.

nochmals Danke
[img]http://www.danasoft.com/sig/newbieneedshelp.jpg[/img]
BlackJack

Donnerstag 31. August 2006, 12:36

Ohne reguläre Ausdrücke und mit Hilfe von `BeautifulSoup` könnte man es so lösen:

Code: Alles auswählen

from cgi import parse_qs
from urllib import splitquery

from BeautifulSoup import BeautifulSoup

source = '''</TR> 
<tr><th align=left>HRG</th> 
<td><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+HRG" TARGET="resource window">15</A></TD> 
<TD><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+HRG" TARGET="resource window">34</A></TD> 
</TR> 
<tr><th align=left>AKR1D1</th> 
<td><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+AKR1D1" TARGET="resource window">2</A></TD> 
<TD><A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+AKR1D1" TARGET="resource window">0</A></TD> 
</TR>
'''

soup = BeautifulSoup(source)
result = list()
for a_tag in soup.findAll('a'):
    dummy, query = splitquery(a_tag['href'])
    if query:
        parameters = parse_qs(query)
        term = parameters['term']
        terms = [x.strip() for x in term[0].split('AND')]
        result.append((terms, a_tag.string))

print result
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Donnerstag 31. August 2006, 12:50

So bekommst du z.B. den ersten Teil mit RE:

Code: Alles auswählen

y = ['<A href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+HRG" TARGET="resource window">15</A>', '<A href=
"http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+HRG" TARGET="resource window">34</A>', '<A href="
http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=liver+AND+AKR1D1" TARGET="resource window">2</A>', '<A href="http://w
ww.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&term=overexpression+AND+AKR1D1" TARGET="resource window">0</A>']
hier1, hier2, hier3 = [], [], []
for i in y:
    hier1.append(re.findall('term=(.+?)\+AND', i)[0])
    hier2.append(re.findall('\+AND\+(.+?)"\s', i)[0])
    hier3.append(re.findall('window">(.+?)</A>', i)[0])
Edit: So, das sollte alles ausgeben (bzw. an die Listen hängen). Und da mach ich das schon in Etappen und bin trotzdem (viel) zu langsam...
Antworten