2016-10-09 5 views
0

Wir können den Text innerhalb eines Tags mit der Funktion get_text() in BeautifulSoup erhalten. Aber was, wenn der Textbereich etwas HTML-ähnlichen Code enthält.Drucken von HTML wie Inhalte bilden eine Textarea mit BeautifulSoup

Beispiel:

from bs4 import BeautifulSoup 
html = "<html><h1>#include <stdio.h></h1></html>" 
soup = BeautifulSoup(html,"lxml") 
print soup.h1.get_text() 

Die obige Programm druckt "#include" aber ich wollte es vollen Text innerhalb h1 sein. Dies ist nur ein kleines Beispiel. Ich arbeite mit Scraping eines C++ Codes aus dem Internet. Ich habe zu dem Textbereich navigiert, in dem Code vorhanden ist, aber wenn ich es drucke, druckt es die Header-Dateien nicht. Textarea:

<textarea rows="20" cols="70" name="file" id="file" style="width: 100%;" data-input-file="1">#include <bits/stdc++.h> 
using namespace std; 
struct points 
{ 
    int x; 
    int count; 
}; 
points a[105]; 
int main() 
{ 
    int n; 
    int k; 
    int t; 
    int i; 
    int j; 

    scanf("%d",&t); 

    while(t--) { 
     scanf("%d%d",&n,&k); 
     for(i = 1; i <= k; i++) { 
      scanf("%d",&a[i].x); 
      a[i].count = 1; 
      if(a[i].x == -1) { 
       a[i].x = 1000000000; 
      } 
     } 

     for(i = 2; i <= k; i++) { 
      for(j = 1; j < i; j++) { 
       if((a[i-j].x + a[j].x) < a[i].x && (a[i-j].count + a[j].count) <= n) { 
        a[i].x = a[i-j].x + a[j].x; 
        a[i].count = a[i-j].count + a[j].count; 
       } 
      } 
     } 

     if(a[k].x == 1000000000) { 
      printf("-1\n"); 
     } 
     else { 
      printf("%d\n",a[k].x); 
     } 
    } 



} 
</textarea> 

Mein Code zum Schaben:

from robobrowser import RoboBrowser 
browser = RoboBrowser(parser = "lxml") 
browser.open('http://www.spoj.com/') 
form = browser.get_form(id='login-form') 
form['login_user'].value = username 
form['password'].value = password 
browser.submit_form(form) 
browser.open('http://www.spoj.com/myaccount') 
l = browser.find(id = "user-profile-tables").find_all('td') 
link = l[0].a['href'] 
link = "http://www.spoj.com" + link 
browser.open(link) 
codelink = browser.find(title = 'Edit source code')['href'] 
codelang = browser.find(class_ = 'slang text-center').get_text() 
codelink = "http://www.spoj.com" + codelink 
browser.open(codelink) 
print browser.find(id = 'submit_form').textarea.get_text() 

Gibt es eine Möglichkeit, es zu erreichen?

Antwort

1

Das Problem ist, die lt und gt Zeichen wie unten entgangen sein sollte:

es sei denn, sie
#include <stdio.h> 

Keiner der Parser, dass Text prüfen gehen:

from bs4 import BeautifulSoup 
html = "<html><h1>#include &lt;stdio.h&gt;</h1></html>" 
soup = BeautifulSoup(html,"lxml") 
print(soup.h1.get_text()) 

die Sie dann würde sind entkommen. Jeder gibt Ihnen #include <stdio.h></stdio.h>

Sie müssen nur auf eine Regex zurückgreifen, um die Include-Anweisungen aus der Quelle selbst zu extrahieren.

patt = re.compile(r"<h1>(\s+)?(#include\s+.*?)(\s+)?</h1>") 
+0

Ich scrapping einen C-Code aus dem Internet und was ich bekomme ist ein Code ohne Header-Dateien. Ich glaube nicht, dass ich damit Ihre Idee verwirklichen kann, da ich den Code nicht in meiner Hand habe. –

+0

@ShivamMitra, können Sie eine Beispiel-URL teilen? Wenn es im Browser angezeigt wird, dann sollte es geflutet werden oder alles, was Sie sehen würden, ist der #include –

+0

Ich habe den Beitrag bearbeitet. –