【发布时间】:2017-06-22 19:39:57
【问题描述】:
我正在使用 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>
这是我对 Beautiful Soup 的尝试:
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>]
【问题讨论】:
-
有趣的是,您使用 find_all 获得的表没有类。这可以解释为什么使用 class_ 进行查找的尝试不起作用。
标签: javascript html web-scraping beautifulsoup