2017-01-23 6 views
0

So habe ich eine HTML-Datei mit einer Reihe von <span> Tags mit style="font-size:...px", und ich möchte automatisch die <span> mit der größten Schriftgröße finden und den Text, der zwischen den Span-Tags ist. Vorzugsweise in R oder Python, aber auch andere Methoden sind willkommen. Irgendwelche Ideen?Parsing HTML-Attribut mit R oder Python

Antwort

1

Für Python 3 können Sie html.parser verwenden. (Für Python 2.x müssen Sie bei HTMLParser aussehen)

Ein Beispiel wäre:

from html.parser import HTMLParser 

class MyHTMLParser(HTMLParser): 

    def __init__(self, min_span): 
     HTMLParser.__init__(self) 

     #Keep track of our maximum entry thus far 
     self.max_span = min_span #set a minimum font size if you like, or just use 0 
     self.max_text = [] #to keep track of many entries 

     #This flags to the object to get data if we found a span tag 
     #with a new highest font-size 
     self.recording = 0 

    def handle_starttag(self, tag, attrs): 

     #Ignore all other tags 
     if tag != 'span': 
      return 

     for name, value in attrs: 
      if name != 'style': 
       continue 

      for css_style in value.split(";"): 
       sub_attrib = css_style.split(":") 
       if sub_attrib[0].strip() != 'font-size': 
        continue 

       this_size = int(sub_attrib[1][:-2]) 
       if (this_size > self.max_span): 
        self.max_text = [] #'reset' the list for new maximum font-size 
        self.max_span = this_size 
        self.recording = 1 
       elif (this_size == self.max_span): #For equally large span font-size tags 
        self.recording = 1 

    def handle_endtag(self, tag): 
     """ 
     Turns off recording flag 
     """ 
     if tag == 'span' and self.recording: 
      self.recording = 0 

    def handle_data(self, data): 
     if self.recording: 
      self.max_text.append(data) 

Nicht sehr gut mit HTML (wie aus meiner vorherigen Antwort), so dass Sie mehr Kontrolle benötigen Fluss für die Rand-Fälle

Verbrauch:

parser = MyHTMLParser(0) 
parser.feed(""" 
<!DOCTYPE html> 
<html> 
<body> 

    <h1>My First Heading</h1> 

    <p>My first paragraph.</p> 

    <span style="font-size:10px;font-family:test">Not this one</span> 
    <span style="font-size:20px">Not this one either</span> 
    <span style="font-size:60px;font-family:hello">Yay!</span> 
    <span style="font-size:10px">Nope</span> 
    <span style="font-size:60px">Also this one</span> 

</body> 
</html> 
""") 

print(parser.max_text) #prints out ['Yay!', 'Also this one'] 

#to get individual entry 
list_of_text = parser.max_text 
first_maximum_text = list_of_text[0] 

Edit: für in einem Verzeichnis über alle HTML-Dateien geht (in Beispiel ist das aktuelle Verzeichnis). Diese Implementierung wird den maximalen Wert für alle HTML-Dateien (wenn Sie die Analyse für jede HTML-Datei einmal wollen, initialisieren Sie die MyHTMLParser nach jeder Iteration und verarbeiten die Ergebnisse)

import os 

def main(): 

    parser = MyHTMLParser(0) 

    for file in os.listdir("./"): 
     if file.endswith(".html"): 
      with open(file, 'r') as fd: 
       parser.feed(fd.read()) 

    print(parser.max_text) 

if __name__ == '__main__': 
    main() 
+0

Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/134080/discussion-on-answer-by-kj-phan-parsing-html-attribute-using-r-or-python) . –