2017-12-15 190 views
6

Uruchomiłem z problemem z moją aplikacją internetową. Oto mój kod:Skrobanie <td> wartości w tabeli generowane przez JavaScript do Pythona

@app.route('/addrec',methods = ['POST', 'GET']) 
def addrec(): 

    if g.user: 
     if request.method == 'POST': 

#UPPER PANE 

      payor = request.form['payor'] 


      receiptno = request.form['OR'] 
      paymentmethod = request.form['paymentmethod'] 
      naive_dt = time.strftime("%m/%d/%Y") 
      collectiondate = naive_dt = datetime.now() 
      message = request.form['message'] 
#LOWER PANE 
      url_to_scrape = 'http://localhost:5000/form' 
      r = requests.get(url_to_scrape) 
      soup = BeautifulSoup(r.text) 
      nature = [] 
      for table_row in soup.select("table.inmatesList tr"): 
       cells = table_row.findAll('td') 
       if len(cells) > 0: 
       nature = cells[0].text.strip() 
       natureamt = cells[1].text.strip() 
       nature = {'nature': nature, 'nature': natureamt} 
       nature_list.append(nature) 
      ent = Entry(receiptno, payor,officer, paymentmethod, collectiondate,message, nature_list) 
      add_entry(ent) 
      actions="Applied" 

      return redirect(url_for('form')) 

    return redirect(url_for('home')) 

Jak widać jestem coraz każdej wartości z moich formularzy i skrobanie wartości w moim stole używając BeautifulSoup. Jednak po kliknięciu przycisku przesyłania ładuje się na zawsze. Dostaję valeus z górnej szyby, ale nie na stole.

Przy okazji generuję moje komórki z funkcji javascript onClick. Na wszelki wypadek mój javascript może być problemem. a może istnieje prosty sposób na wyodrębnienie tych wartości z funkcji javascrip -> python. Oto mój kod JavaScript i HTML

<script type="text/javascript"> 
    function deleteRow(o){ 
    var p=o.parentNode.parentNode; 
     p.parentNode.removeChild(p); 
     } 

    function addRow() 
     { 

     var table = document.getElementById("datatable"), 
      newRow = table.insertRow(table.length), 
      cell1 = newRow.insertCell(0), 
      cell2 = newRow.insertCell(1), 
      cell3 = newRow.insertCell(2), 


      name = document.getElementById("form").value, 
      amount = document.getElementById("amount").value; 


      delete1 = delete1 = '<input type="button" class="btn btn-danger" class="glyphicon glyphicon-trash"id="delete" value="Delete" onclick="deleteRow(this)">'; 
     cell1.innerHTML = name; 
     cell2.innerHTML = amount; 
     cell3.innerHTML = delete1; 

     findTotal(); 
     } 


function findTotal(){ 
    var arr = document.querySelectorAll("#datatable td:nth-child(2)"); 
    var tot=0; 

    for(var i=0;i<arr.length;i++){ 
     var enter_value = Number(arr[i].textContent) 
     if(enter_value) 
       tot += Number(arr[i].textContent); 
     } 
    document.getElementById('total').value = tot; 
} 

</script> 

HTML:

    <form name="noc"> 

         <input class="form-control input-lg" id="form" list="languages" placeholder="Search" type="text" required> 
         <br> 
         <input class="form-control input-lg" id="amount" list="languages" placeholder="Amount" type="number" required> 
         <br> 
         <button onclick="addRow(); return false;">Add Item</button> 
        </form> 




     <table id="datatable" class="table table-striped table-bordered" cellspacing="0" width="100%"> 
       <thead> 
    <tr> 
    <th>Nature of Collection</th> 
    <th>Amount</th> 
    <th></th> 

    </tr> 
     </thead> 
<tbody> 
<tr> 

     </tr>  
</tbody> 

</table> 

Dane z tych szlifowanych wartości, spodziewam się, aby były zapisane w mojej bazy danych. Na komórce. Jeśli to możliwe, chciałbym, aby lista została wstawiona do kolumny, więc mogę je później pobrać.

A może jest sposób, w jaki mogę uzyskać listę na czystszy i lepszy sposób do mojej bazy danych? Każda pomoc jest doceniana. Dziękuję Ci!

+0

Web-skrobanie strony z własnej aplikacji internetowej brzmi bardzo źle, po prostu mówiąc. – alecxe

+0

@alecxe co sugerowałbyś w tym przypadku sir? Występuję również w tym samym przypadku przypadkowo – Rekt

Odpowiedz

1

Wygląda na to, że używasz próśb, aby spróbować uzyskać dane wygenerowane przez JS. Cóż, to nie zadziała, chyba że znasz magię, której wielu ludzi nie wie. Żądania nie mogą zajmować się JS, więc nigdy nie działa. Powinieneś być w stanie uzyskać dane za pomocą selenu lub coś, aby zautomatyzować przeglądarkę. W przeciwnym razie, nie sądzę, że będziesz w stanie zeskrobać to w ten sposób. Ale jeśli ktoś zna sposób, w jaki JS generuje dane za pomocą żądań, opublikuj go.

+0

Myślę, że tak nie jest w tym przypadku, funkcja javascript generuje około i myślę, że jest to wartość, którą chce zeskrobać mając nadzieję, że może pobrać wartości, których potrzebuje. Gdybym był nim, chciałbym znaleźć sposób na przekazanie nowo utworzonych wartości skryptu Java do mojego skryptu Python. Ale tak, też nie wiem, może ktoś wie, jak to zrobić. Właśnie dlatego głosuję na to pytanie. Ktoś może wiedzieć, że "magia" imo. Zastrzeżenie: Nie jestem dobry w javascript. – Rekt

+1

@Rekt Tak, właśnie o to mi chodziło. Może muszę zmienić moją wiadomość, ale rozumiem, że funkcja JS nigdy nie będzie działać, jeśli używasz żądań, więc dane nie istnieją na stronie, którą "otrzymasz". Daje mi to ból głowy więcej niż raz i chciałbym znaleźć rozwiązanie, które nie byłby selenem. – SuperStew