Seite 1 von 1

Modul 're' und regular expressio

Verfasst: Donnerstag 31. August 2006, 10:52
von newbie_needs_help
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!

Verfasst: Donnerstag 31. August 2006, 11:10
von aquila
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]

Verfasst: Donnerstag 31. August 2006, 12:20
von newbie_needs_help
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

Verfasst: Donnerstag 31. August 2006, 12:36
von BlackJack
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

Verfasst: Donnerstag 31. August 2006, 12:50
von Nirven
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...