2009-04-17 6 views
0

Ich versuche, eine Zeile von einer Webseite zu ändern. Die Zeile ist wie folgt:Python Regexp Problem

Dies ist, was ich versucht habe, aber es scheint nicht zu funktionieren, kann mir jemand helfen? 'htmlbody' enthält die html-Seite und nein, ich habe nicht vergessen, 're' zu importieren.

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.search(htmlbody) 
print 'Value is', value 

Antwort

1

Es klingt wie Sie findall anstatt search verwenden möchten:

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.findall(htmlbody) 
print 'Found %i match(es)' % len(value) 

ich Sie warnen, müssen aber, dass reguläre Ausdrücke notorisch sind schlecht im Umgang mit HTML. Sie sind besser dran mit einem geeigneten Parser mit der HTMLParser module built in to Python.

1

Diese

import re 

htmlbody = "<tr><td width=60 bgcolor='#ffffcc'><b>random Value</b></td><td align=center width=80>" 

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.search(htmlbody).group(1) 
print 'Value is', value 

druckt

Value is random Value 

Ist das, was Sie wollen?

+0

Nicht vollständig. Es funktioniert, wenn der ... String zu htmlbody ernannt wird. In meinem Skript ist htmlbody jedoch eine ganze HTML-Seite. Und in diesem Fall scheint es nicht zu funktionieren. Ich habe vergessen zu sagen: Die Seite enthält mehrere Instanzen dieser Zeile ... – MarcoW

+0

Meinst du, dass möglicherweise in der vorherigen Zeile sein? Ist es möglich, es von regexp auszuschließen? Sie können versuchen, alle Zeilen zu lesen, sie ohne Zeilenumbrüche zusammenzufügen und nach allen Vorkommen von bestimmten regulären Ausdrücken zu suchen. Oder Sie können versuchen, Regexp allgemeiner zu machen. – clorz

4

Es gibt keine sichere Möglichkeit, dies mit einem Regex zu tun. Siehe Can you provide some examples of why it is hard to parse XML and HTML with a regex? für warum. Was Sie brauchen, ist ein HTML-Parser wie HTMLParser:

#!/usr/bin/python 

from HTMLParser import HTMLParser 

class FindTDs(HTMLParser): 
     def __init__(self): 
       HTMLParser.__init__(self) 
       self.level = 0 

     def handle_starttag(self, tag, attrs): 
       if tag == 'td': 
         self.level = self.level + 1 

     def handle_endtag(self, tag): 
       if tag == 'td': 
         self.level = self.level - 1 

     def handle_data(self, data): 
       if self.level > 0: 
         print data 

find = FindTDs() 

html = "<table>\n" 
for i in range(3): 
     html += "\t<tr>" 
     for j in range(5): 
       html += "<td>%s.%s</td>" % (i, j) 
     html += "</tr>\n" 
html += "</table>" 

find.feed(html)