2016-07-07 4 views
1

Ich versuche Python Herausforderung zu machen. http://www.pythonchallenge.com/pc/def/ocr.html Ok. Ich weiß, ich kann einfach kopieren den Code aus der Quelle in eine TXT-Datei kopieren und solche Dinge machen, aber ich möchte es aus dem Internet nehmen, um mich selbst zu verbessern. (+ Ich habe es schon getan) Ich habe versuchtPython Wie bekomme ich einen bestimmten Code in der Website mit re

re.findall(r"<!--(.*?)-->,html) 

Aber es bekommt nichts. Wenn Sie mein vollständiger Code wollen, ist hier:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import requests,re 
link = "http://www.pythonchallenge.com/pc/def/ocr.html" 
x = requests.get(link) 
codes = re.findall(r"<!--(.*)-->",str(x.content)) 
print codes 

Auch habe ich versucht, es so zu machen:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import requests,re 
link = "http://www.pythonchallenge.com/pc/def/ocr.html" 
x = requests.get(link) 
codes = re.findall("<!--\n(.*)\n-->",str(x.content)) 
print codes 

Jetzt findet es den Text aber noch nicht, dass Chaos bekommen :(

Antwort

1

Nicht sicher, was Sie mit "that mess" meinen. Sie sollten alle Details der Herausforderung in diesem Beitrag enthalten, anstatt Benutzer mit dem pythonchallenge Beitrag zu verknüpfen.

Entweder Wenn Sie die Regex im einzeiligen Modus setzen, //s, dann sollte das Punktzeichen . mit den Zeilenvorschüben /n übereinstimmen. Dies vermeidet die \n(.+)\n Konstruktion in Ihrer Regex, die Ihr Problem lösen kann.

Hier ist ein link to a working regex example.

Hier ist die modifizierte Python 2.7 Code:

#!/usr/bin/python 
import requests, re 
link = "http://www.pythonchallenge.com/pc/def/ocr.html" 
x = requests.get(link) 
codes = re.findall("<!--(.*?)-->", str(x.content), re.S) 
print codes[1] 

Note die re.S, (.*?) und codes[1] Modifikationen.

  • re.S ist Flagge Python für //s
  • (.*?) den * macht quantifier nicht gierigen
  • codes[1] druckt den zweiten Satz von Inhalten in HTML-Kommentaren (seit findall(..) Matches 2 und gibt einen Array von beiden Sätzen) gefunden .
+0

Bitte geben Sie eine python2.7 Beispiel. – Brian

+0

Notwendige Änderungen vorgenommen. Danke für das Feedback – wpcarro

+0

In der Website haben sie diesen Code mit dem Namen "Chaos" eingeführt, auch brauchen Sie kein Konto, um diese Website zu gehen. Vielen Dank für deine Antwort. –

1

können Sie lösen:

codes = re.findall("/<!--(.*?)-->/s",str(x.content)) 

"s" finden, mit Leerzeichen und Bruchkante

2

Ich würde einen HTML-Parser verwendet statt. Sie können find comments in HTML mit BeautifulSoup.

Arbeitscode:

import requests 
from bs4 import BeautifulSoup, Comment 


link = "http://www.pythonchallenge.com/pc/def/ocr.html" 
response = requests.get(link) 

soup = BeautifulSoup(response.content, "html.parser") 

code = soup.find_all(text=lambda text: isinstance(text, Comment))[-1] 
print(code.strip()) 
+0

Ich versuchte mit bs4, aber es war zu schwer zu kontrollieren bs4 :(Auch ich bin wahrscheinlich neu zu python so kann ich nicht verstehen, Lambda. Können Sie eine Funktion? –

+0

@ Dr.UK gut, wenn Sie HTML-Quelle haben zu analysieren, sollten Sie [sollten keine regulären Ausdrücke verwenden] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) im Allgemeinen. Was deine Frage betrifft, so ist "Lambda" nur ein kurzer Weg, um eine Funktion zu schreiben. Du musst nur selten Funktionen in BeautifulSoup übergeben, wie in diesem Fall, BeautifulSoup ist ziemlich bequem und einfach mit der Bibliothek zu arbeiten. Hoffe das hilft. – alecxe

+0

@Dr .UK, wenn Sie bs4 zu schwer zu kontrollieren finden, dann viel Glück mit verschachtelten Elementen und einer Regex. –