2017-10-12 1 views
1

Ich versuche, mein Programm so zu konfigurieren, dass jede regex.findAll() -Methode korrekt in den HTML-Parser eingeht, wie im Code-Ausschnitt unten zu sehen ist . Das Problem ist, dass ich bekommePython-UnboundLocalError: lokale Variable, auf die vor der Zuweisung verwiesen wird - Reguläre Ausdrücke/if else

UnboundLocalError: local variable referenced before assignment

für headingList und imageList, je nachdem, wie ich meinen Code ändern. Ich denke, das liegt daran, dass die if-Anweisungen nicht über den ersten if-Block hinausgehen, wie es wahr ist. Ich versuchte, if heading and image and description and storyLink and date: zu benutzen und alle Variablen innerhalb der einen für Schleife zu verursachen, aber wenn ich das Programm laufe, passiert nichts, was auch immer. Ich denke, es ist die Struktur meines Codes, oder es kann sogar der reguläre Ausdruck für die Bildvariable sein, die das Problem verursacht, aber ich denke nicht. Jede Hilfe wäre sehr dankbar :)

EDIT: HTML snippet being used to parse from regex

def extractNews(): 
    selection = listbox.curselection() 

    if selection == (0,): 
     # Read the webpage: 
     response = urlopen("file:///E:/University/IFB104/InternetArchive/Archives/Sun,%20October%201st,%202017.html") 
     html = response.read() 
     #regex 
     heading = findall((r'<h2 class="post-title"><a href="(.*?)".*?>(.*?)</a></h2>'), str(html)) 
     image = findall((r'<span data-omni-sm-delegate="(.*)">(\n|\r)\s+<a href="(.*)></a>(\n|\r)\s+</span>'), str(html)) #<span data-omni-sm-delegate="(.*)">(\n|\r)\s+<a href="(.*)></a>(\n|\r)\s+</span> 
     description = findall((r'<h2 class="post-title"><a href="(.*?)".*?>(.*?)</a></h2>'), str(html)) 
     storyLink = findall((r'<h2 class="post-title"><a href="(.*?)".*?>(.*?)</a></h2>'), str(html)) 
     date = findall((r'<h2 class="post-title"><a href="(.*?)".*?>(.*?)</a></h2>'), str(html)) 

     if heading: 
      headingList = [] 
      for link, title in heading: 
       headingVariable = "%s" % (title) 
       headingList.append(headingVariable) 

     if image: 
      imageList = [] 
      for link, title in image: 
       imageVariable = "%s" % (title) 
       imageList.append(imageVariable) 

     if description: 
      descriptionList = [] 
      for link, title in description: 
       descriptionVariable = "%s" % (title) 
       descriptionList.append(descriptionVariable) 

     if storyLink: 
      storyLinkList = [] 
      for link, title in storyLink: 
       storyLinkVariable = "%s" % (title) 
       storyLinkList.append(storyLinkVariable) 

     if date: 
      dateList = [] 
      for link, title in date: 
       dateVariable = "%s" % (title) 
       dateList.append(dateVariable) 




     html_str = ('<!DOCTYPE html>\n' 
     '<html>\n' 
     '<head>\n' 
     '<title>TechCrunch Archive - Sun, October 1st, 2017</title>\n' 
     '</head>\n' 
     '<body>\n' 
     '<h1>' + headingList[0] + '</h1>\n' 
     '<a href="'+ imageList[0]+'></a>\n' 
     '<p>description goes here</p>\n' 
     '<p>full story link goes here</p>\n' 
     '<p>date goes here</p>\n' 
     '<br><br>\n' 
     '<h1>' + headingList[1] + '</h1>\n' 
     'image goes here\n' 
     '<p>description goes here</p>\n' 
     '<p>full story link goes here</p>\n' 
     '<p>date goes here</p>\n' 
     '<br><br>\n' 
     '<h1>' + headingList[2] + '</h1>\n' 
     'image goes here\n' 
     '<p>description goes here</p>\n' 
     '<p>full story link goes here</p>\n' 
     '<p>date goes here</p>\n' 
     '<br><br>\n' 
     '</body>\n' 
     '</html>)') 

     Html_file = open("ExtractedContent/Sun, October 1st, 2017 - Extracted.html", "w") 
     Html_file.write(html_str) 
     Html_file.close() 
+0

Sie haben überprüft, dass die Werte von "Überschrift" und "Bild" sind, was Sie erwarten, richtig? –

+0

Wenn ich den gleichen regulären Ausdruck in Überschrift für Bild verwenden, tritt das Problem nicht auf und importiert fein. Wenn jedoch mein versuchte Regex-Ausdruck verwendet wird, wird der Fehler zurückgegeben. Ich dachte, dass dies der Fall sein könnte, aber ich dachte nicht, dass ein falscher regulärer Ausdruck das Problem verursachen würde. Ich habe damit gerechnet, dass nur der falsche Inhalt importiert wird. Weißt du, warum dies der Fall sein könnte? – mattappdev

+0

Welche Werte erhalten Sie für "Überschrift" und "Bild", und unterscheiden sie sich von dem, was Sie erwartet haben? –

Antwort

1

I think this is because of the if statements not continuing past the first if block as it is true.

Das ist der Fall für if/elif wäre. Ihre Bedingungen sind nicht wahr, so dass Listen nicht erstellt werden, wahrscheinlich (schwer zu sagen, ohne html), weil findall nichts gefunden und eine leere Liste zurückgegeben, die False ist.

I tried using if heading and image and description and storyLink and date: and creating all of the variables inside the one for loop but when I run the program nothing happens what so ever.

Nichts passiert, weil nicht alle Bedingungen True sind.

1

Seit image ist [], if image schlägt fehl, und imageList ist nie zugewiesen.

Überprüfen Sie die Regex für image. Besser noch, verwenden Sie einen richtigen Parser (zum Beispiel HTMLParser).

+0

Ich verstehe nicht, was falsch gelaufen ist als [diese] (http://prntscr.com/gwixel) [zwei] (https://prnt.sc/gwitcv) Schnipsel machen Sinn, oder? Die Regex scheint mir nicht falsch ..? – mattappdev

+0

Python ist anderer Meinung und seine Meinung zählt. –

+0

Können Sie Probleme erkennen? Ich bin ziemlich neu in regulären Ausdrücken, also finde ich es schwer. – mattappdev

Verwandte Themen