Javascript 如何读取HTML表格数据?返回';无';

Javascript 如何读取HTML表格数据?返回';无';,javascript,html,web-scraping,beautifulsoup,Javascript,Html,Web Scraping,Beautifulsoup,我正在使用BeautifulSoup从HTML表中读取数据。为什么我不能从表中得到结果,我如何修复它?我的代码返回“无” 我看到页面源代码中有javascript,并且已经读到这可能是一个问题。url运行输入到表中的报告 我使用了soup.prettify()来检查HTML,但它似乎没有给出完整的源代码。我不确定这是否是一个问题 以下是表格和第一个数据行的HTML: <table data-toggle="table" data-show-columns="true

我正在使用BeautifulSoup从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>
我也尝试过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>]
[
用户名
密码
还记得我的登录吗

]
在我看来,你好像把早期版本的beautiful soup和新版本的beautiful soup中使用的旧版本混在了一起

我会尝试:
soup.find(“表格”,class=“表格数据”)

这是Beauty soup较新版本的语法。希望这就是你正在使用的


我没有安装beautiful soup,因此无法验证,但您可以试一试。

您的查找呼叫中有一个错误

您正在搜索同时具有表数据类和表类的表元素。但是,正如您所看到的,表中只有类表数据,而不是表1。将代码替换为:

print(soup.find('table',{'class':'table-data'}))
更新:正如您在更新中所说,该网页似乎是动态创建的。因此,请打印完整的HTML网页(或将其保存到一个文件)并处理该代码(不要使用您在Google Chrome或其他浏览器检查器中看到的代码,他们在加载文档后生成了一些代码)

  • 如果你有所有你需要的代码,就这些
  • <> LI>如果您没有您所需要的,请考虑使用WebKIT Web客户端,而不是URLlib/Advices,以获得动态创建的网页HTML。然后,您可以使用纯JavaScript获取您正在搜索的元素,或者也可以使用BeautifulSoup
我尝试过,但没有成功;它仍然不返回任何值。我注意到的另一件奇怪的事情是,如果我检查Google Chrome中的元素,该表的类是
class=“table data table hover”
而不是源代码中显示的
class=“table data
。我尝试了一个修改版本,将其替换为=,因为您的建议给了我一个语法错误。使用
print(soup.find('table',class='table-data'))
仍然没有给我任何建议。关于替代解决方案还有其他想法或建议吗?是的,你是对的,应该是“=”不是“:”-将进行编辑。你使用的是什么版本的Beautiful Soup?“class”在Python中是一个保留字,因此从4.1.2开始,他们使用class_u来表示它。你可以尝试的另一件事是
Soup.select(table.table data)
soup.find(“table”,attrs={“class”:“table data”})
有趣的是,使用find_获得的表都没有类。这就解释了为什么使用class_进行查找的尝试不起作用。
print(soup.find('table',{'class':'table-data'}))