如何解析具有相同 class 名称的 table 单元格中的值
How to parse values in a table cell with the same class name
我试图通过控件 WebView2
获取具有相同 class 名称的 table 单元格中的值
获取单个值很有用,但现在我想考虑可能恰好有多个值。
table 完整的 html 代码是:
<tbody data-v-39c7db2a=""><tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:57:47</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003888
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00388800
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr><tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:43:51</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003890
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00389000
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr></tbody>
而table中每一行的代码是:
<tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:57:47</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003888
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00388800
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr>
我感兴趣的值是百分比,如本例中的 0.0000%。
由于 class 名称相同,我如何循环才能获得所有名称?
这需要更多 javascript 才能工作。但是,一旦实施,它应该会更好地工作。
首先将下面的javascript保存到'script.js'在你项目的根目录(或者一个子目录,如果你在代码中改变了路径)。 确保 select 文件的属性和 select Copy to output directory: Copy if newer
。这会复制脚本文件,以便 WebView2
可以找到它。
这是javascript:
let GetOrders = function ()
{
let doubles = [];
let cells = document.querySelectorAll('div.ordersO.exchange-card.layout-r td.text-right');
let filteredArray = Array.from(cells).filter(function (value)
{
return value.textContent.includes('%') && value.nextElementSibling?.firstElementChild?.textContent.includes('Cancel');
});
filteredArray.forEach(function (value)
{
doubles.push(+/[\d.+-]+/.exec(value.textContent)[0]);
});
return doubles;
};
现在您已经有了 javascript,您可以在表单中实现代码。由于我不知道 Vb.net,我用 C# 显示代码(应该很容易翻译)。这是整个表单文件:
using Newtonsoft.Json;
using Microsoft.Web.WebView2.Core;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void Form1_Load(object sender, EventArgs e)
{
await webView21.EnsureCoreWebView2Async();
//webView21.CoreWebView2.Navigate(Path.Combine(Environment.CurrentDirectory, "html.html")); // Just my testing with your html
}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
string script = File.ReadAllText("script.js");
await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script);
}
private async void Button1_Click(object sender, EventArgs e)
{
string json = await webView21.ExecuteScriptAsync("GetOrders()");
decimal[] orders = JsonConvert.DeserializeObject<decimal[]>(json) ?? Array.Empty<decimal>();
if (orders.Length == 0)
{
MessageBox.Show("No orders");
}
else
{
MessageBox.Show(String.Join(',', orders));
}
}
}
}
请注意,我使用 CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync
- 在页面中注入代码,以便您稍后调用它。
因为 ExecuteScriptAsync
returns JSON,我使用 JsonSerializer.Deserialize<decimal[]>
创建一个 decimal
值的数组。
如果没有订单(returns 一个空数组),此代码也有效。
编辑:
更改为使用 Newtonsoft.Json
。
编辑2:
更改了 javascript 代码以避免重复!
我试图通过控件 WebView2
获取具有相同 class 名称的 table 单元格中的值获取单个值很有用,但现在我想考虑可能恰好有多个值。 table 完整的 html 代码是:
<tbody data-v-39c7db2a=""><tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:57:47</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003888
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00388800
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr><tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:43:51</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003890
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00389000
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr></tbody>
而table中每一行的代码是:
<tr data-v-39c7db2a=""><td data-v-39c7db2a="" class="text-left">12-31 19:57:47</td> <td data-v-39c7db2a="" class="text-center">Limit</td> <td data-v-39c7db2a="" class="text-center market">KIBA/USDT</td> <td data-v-39c7db2a="" class="text-left price price-down">
0.00003888
</td> <td data-v-39c7db2a="" class="amount leftAmount text-left"><span data-v-39c7db2a=""><!---->
100
KIBA
</span></td> <td data-v-39c7db2a="" class="text-left total">
0.00388800
USDT
</td> <td data-v-39c7db2a="" class="text-right">
0.0000%
</td> <td data-v-39c7db2a="" class="text-right"><span data-v-39c7db2a="" class="cancel ordersO_title_cancelall">Cancel</span></td></tr>
我感兴趣的值是百分比,如本例中的 0.0000%。 由于 class 名称相同,我如何循环才能获得所有名称?
这需要更多 javascript 才能工作。但是,一旦实施,它应该会更好地工作。
首先将下面的javascript保存到'script.js'在你项目的根目录(或者一个子目录,如果你在代码中改变了路径)。 确保 select 文件的属性和 select Copy to output directory: Copy if newer
。这会复制脚本文件,以便 WebView2
可以找到它。
这是javascript:
let GetOrders = function ()
{
let doubles = [];
let cells = document.querySelectorAll('div.ordersO.exchange-card.layout-r td.text-right');
let filteredArray = Array.from(cells).filter(function (value)
{
return value.textContent.includes('%') && value.nextElementSibling?.firstElementChild?.textContent.includes('Cancel');
});
filteredArray.forEach(function (value)
{
doubles.push(+/[\d.+-]+/.exec(value.textContent)[0]);
});
return doubles;
};
现在您已经有了 javascript,您可以在表单中实现代码。由于我不知道 Vb.net,我用 C# 显示代码(应该很容易翻译)。这是整个表单文件:
using Newtonsoft.Json;
using Microsoft.Web.WebView2.Core;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void Form1_Load(object sender, EventArgs e)
{
await webView21.EnsureCoreWebView2Async();
//webView21.CoreWebView2.Navigate(Path.Combine(Environment.CurrentDirectory, "html.html")); // Just my testing with your html
}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
string script = File.ReadAllText("script.js");
await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script);
}
private async void Button1_Click(object sender, EventArgs e)
{
string json = await webView21.ExecuteScriptAsync("GetOrders()");
decimal[] orders = JsonConvert.DeserializeObject<decimal[]>(json) ?? Array.Empty<decimal>();
if (orders.Length == 0)
{
MessageBox.Show("No orders");
}
else
{
MessageBox.Show(String.Join(',', orders));
}
}
}
}
请注意,我使用 CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync
- 在页面中注入代码,以便您稍后调用它。
因为 ExecuteScriptAsync
returns JSON,我使用 JsonSerializer.Deserialize<decimal[]>
创建一个 decimal
值的数组。
如果没有订单(returns 一个空数组),此代码也有效。
编辑:
更改为使用 Newtonsoft.Json
。
编辑2:
更改了 javascript 代码以避免重复!