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.
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]
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...