簡體   English   中英

如何讀取HTML表格數據w美湯? 返回“無”

[英]How to read HTML table data w Beautiful Soup? Returning 'None'

我正在使用Beautiful Soup從HTML表讀取數據。 為什么我不能從表格中得到結果,如何解決? 我的代碼返回“無”。

我看到頁面源代碼中有JavaScript,並且已閱讀,可能是一個問題。 該url運行一個輸入到表中的報告。

我已經使用了soup.prettify()來檢查HTML,但它似乎沒有提供完整的源代碼。 我不確定這是否是問題。

這是表格的HTML和第一行數據:

    <table data-toggle="table"
        data-show-columns="true"
        data-show-export="true"
        data-show-toggle="true"
        class="table-data">
        <thead>
            <tr>
                <th data-field="RouteId" data-sortable="true">Route ID</th>
                <th data-field="RouteName" data-sortable="true">Route Name</th>
                <th data-field="TripId" data-sortable="true">Trip ID</th>
                <th data-field="TripName" data-sortable="true">Trip Name</th>
                <th data-field="InstanceId" data-sortable="true">INST ID</th>
                <th data-field="InstanceDate" data-sortable="true">INST Date</th>
                <th data-field="InstanceStatus" data-sortable="true">INST Status</th>
                <th data-field="InstanceCapacity" data-sortable="true">INST Cap.</th>
                <th data-field="NumOrders" data-sortable="true">Num. ORDs</th>
                <th data-field="OrderId" data-sortable="true">ORD ID</th>
                <th data-field="OrderType" data-sortable="true">ORD Type</th>
                <th data-field="OrderStatus" data-sortable="true">ORD Status</th>
                <th data-field="VehicleYear" data-sortable="true">VEH Year</th>
                <th data-field="VehicleMake" data-sortable="true">VEH Make</th>
                <th data-field="VehicleModel" data-sortable="true">VEH Model</th>
                <th data-field="VehicleRefNo1" data-sortable="true">VEH RefNo1</th>
                <th data-field="vehicleVin" data-sortable="true">VEH Vin</th>
                <th data-field="DriverId" data-sortable="true">DRV ID</th>
                <th data-field="DriverName" data-sortable="true">DRV Name</th>
                <th data-field="ScheduledPickupDateTime" data-sortable="true">Sch. Pick</th>
                <th data-field="ActualPickupPickupDateTime" data-sortable="true">Act. Pick</th>
                <th data-field="DeliveredDateTime" data-sortable="true">Hand. Rec.</th>
                <th data-field="HandheldDateTime" data-sortable="true">Del.</th>
            </tr>
        </thead>
        <tbody>

            <tr>
                <td>160</td>
                <td>8 LEG: MEM to PRES</td>
                <td>187</td>
                <td>Trip 1 - Leg 7</td>
                <td>740685</td>
                <td>2017-02-01</td>
                <td>Active</td>
                <td>9.00000</td>
                <td>9</td>
                <td>9110734</td>
                <td>LoadLegChild</td>
                <td>InRoute</td>
                <td>2015</td>
                <td>Jeep</td>
                <td>Patriot</td>
                <td>2000047350</td>
                <td>1C4NJPFBXFD318536</td>
                <td>1</td>
                <td>User, System</td>
                <td>2017-02-01 02:05 AM</td>
                <td>2017-02-01 02:20 AM</td>
                <td></td>
                <td></td>
            </tr>

這是我嘗試美麗湯的嘗試:

from urllib.request import urlopen
from bs4 import BeautifulSoup

page = urlopen(url)
soup = BeautifulSoup(page,'lxml')
print(soup.find('table',{'class':'table-data table'}))

我也嘗試過xpath但收到一個空列表:

import requests
from lxml import html
NewPage = requests.get(url)
tree = html.fromstring(NewPage.content)
tree.xpath('//*[@id="content"]/div[2]/div[2]/div[2]/div[2]/table/tbody/tr[1]/td[1]')

更新:我在想我要使用的表是動態創建的; 我將如何更改我的代碼以解決此問題? 我也嘗試過使用find_all檢查我的工作,但它不會帶回HTML中的每個表,只會帶回第一個表。 為什么是這樣?

page = requests.get(url)
pageText = page.text
soup = BeautifulSoup(pageText,'lxml')
print(soup.find_all('table'))

這是輸出:

[<table cellpadding="0" cellspacing="0" id="Login1">
<tr>
<td>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="UserName">Username</label>
<input class="form-control" id="Login1_UserName" name="Login1$UserName" type="text"/>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="Password">Password</label>
<input class="form-control" id="Login1_Password" name="Login1$Password" type="password"/>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<input id="Login1_RememberMe" name="Login1$RememberMe" type="checkbox"/><label for="Login1_RememberMe">Remember my login</label>
</div>
<div class="col-md-6 text-right">
<input class="btn btn-default" id="Login1_Login" name="Login1$Login" type="submit" value="Login"/>
</div>
</div>
<p>
</p>
</td>
</tr>
</table>]

在我看來,您似乎正在混淆舊版本的漂亮湯和新版本中使用的舊表格。

我會嘗試: soup.find("table", class_="table-data")

這是新版美麗湯的語法。 希望這就是您正在使用的。

我沒有安裝漂亮的湯,所以無法驗證,但是您可以嘗試一下。

查找呼叫中有一個錯誤

您正在搜索同時具有表數據 類的元素。 但是,如您所見,該表僅具有類table-data ,而不具有一。 將代碼替換為:

print(soup.find('table',{'class':'table-data'}))

更新 :好像您在更新中所說的,網頁是動態創建的。 因此,請打印完整的HTML網頁(或將其保存到文件中)並解決該代碼( 不要使用您在Google Chrome瀏覽器或其他瀏覽器檢查器中看到的代碼 ,它們會在加載文檔后生成一些代碼。)。

  • 如果您擁有該代碼所需的一切,僅此而已。
  • 如果您沒有所需的內容,請考慮使用Ghost webkit Web客戶端而不是urllib / requests來動態創建網頁HTML。 然后,您可以使用純JavaScript來獲取要搜索的元素,或者也可以使用Beautiful Soup。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM