将 Javascript 生成的表上的 <td> 值抓取到 Python

Posted

技术标签:

【中文标题】将 Javascript 生成的表上的 <td> 值抓取到 Python【英文标题】:Scraping <td> values on table generate by Javascript to Python 【发布时间】:2018-05-29 21:30:15 【问题描述】:

我的网络应用程序出现问题。 这是我的代码:

@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'))

如您所见,我正在从表单中获取每个值,并正在使用 beautifulsoup 抓取表中的值。但是,在我单击提交按钮后,它会永远加载。我从上窗格中获取 valeus,但不在表格中。

顺便说一下,我是从 javascript 函数 onClick 生成单元格的。以防万一我的javascript可能是问题。或者也许有一种简单的方法可以从 javascrip 函数-> python 中提取这些值。这是我的 javascript 代码和 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" >
                <thead>
    <tr>
    <th>Nature of Collection</th>
    <th>Amount</th>
    <th></th>

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

        </tr>     
</tbody>

</table>

这些刮取值的数据,我希望它们保存到我的数据库中。在一个单元格上。如果可能的话,我希望将列表插入列中,以便稍后获取。

或者有没有一种方法可以让我的数据库更清晰、更好地获取列表?任何帮助表示赞赏。谢谢!

【问题讨论】:

网页抓取您自己的网络应用程序的页面听起来很不对,只是说。 @alecxe 在这种情况下,先生,您有什么建议?我也碰巧遇到了同样的问题 【参考方案1】:

所以看起来您正在使用请求来尝试获取 JS 生成的数据。好吧,这是行不通的,除非你知道一些很多人不知道的魔法。请求无法处理 JS,因此它永远不会运行。您应该能够使用 selenium 或其他工具来自动化浏览器来获取数据。否则,我认为您将无法像这样刮掉它。但是,如果有人知道一种通过请求获取 JS 生成数据的方法,请发布。

【讨论】:

我认为这里不是这种情况,javascript 函数会生成一些 ,我认为这是他想要被抓取的值,希望它可以获取他需要的值。如果我是他,我会想找到一种方法将那些新创建的 Java 脚本值传递给我的 Python 脚本。但是,是的,我也不知道,也许有人知道怎么做。这就是为什么我要投票赞成这个问题。有人可能知道“魔术”imo。免责声明:我不擅长 javascript。 @Rekt 是的,这就是我的意思。也许我需要改写我的帖子,但我的理解是,如果您使用请求,JS 函数将永远不会运行,因此您“获取”的页面中不存在 数据。它不止一次让我头疼,我很想找到一个不是硒的解决方案。

以上是关于将 Javascript 生成的表上的 <td> 值抓取到 Python的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL & Access :: 生成未插入值的 LOG

如何在 EF Code First 中声明具有 Medium Blob 数据类型的表上的字段

如何应用嵌套在 div 内的表上的 jquery?

SQL Server "<>" 运算符与具有几百万行的表上的 "=" 相比非常慢

不在数据库中的表上的外键,使用 ORM

有很多行的表上的基本选择非常慢