使用 Htmlagility 从 url 解析表格
Parsing Tables from a url with Htmlagility
我是 C# 的初学者,我正在尝试学习如何使用 htmlagility 从网站获取(提取)table 数据,然后在我的应用程序中显示它。
有人知道为什么 .Load 不起作用吗?或者仅通过 UWP 编码不起作用?
编译器说“HtmlWeb”不包含 'Load' 的定义,并且找不到接受类型 'HtmlAgilityPack.HtmlWeb' 的第一个参数的扩展方法 'Load'(您是否缺少using 指令或程序集引用?)。
为什么会这样,如何解决?
public class HtmlWeb{
public HtmlWeb()
{
string Url = "http://google.de";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument document = htmlWeb.Load(Url);
谢谢大家X.L
如前所述,您需要编写自己的 Load(string url)
函数。我很无聊,以前从未听说过 HtmlAgilityPack
,所以我模拟了一些你可以使用的东西。它读取 url http://www.w3schools.com/html/html_tables.asp 并找到所有 <table>
节点,然后遍历它们以找到所有 <td>
和 <th>
节点。然后将所有单元格内部文本写入页面
这是 aspx 页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication5.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>HtmlAgilityPack quasi table parser</title>
</head>
<body>
<h1>Number of tables <asp:Literal ID="litNumTables" runat="server" /></h1>
<strong>Each <th> and <td> node of each <table> [table][row][cell]</strong>
<ul>
<asp:Repeater ID="rptTrNodes" Runat="server">
<ItemTemplate>
<li>
<%# Container.DataItem.ToString() %>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</body>
</html>
这是 C# 代码:
using System;
using System.Linq;
using HtmlAgilityPack;
using System.Net;
using System.Collections.Generic;
namespace WebApplication5
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.w3schools.com/html/html_tables.asp"));
var root = html.DocumentNode;
var tableNodes = root.Descendants("table");
var items = new List<string>();
foreach(var tbs in tableNodes.Select((tbNodes,i) => new { tbNodes = tbNodes, i = i }))
{
items.Add(string.Format("<h2><table> {0}<h2>", tbs.i));
var trs = tbs.tbNodes.Descendants("tr");
foreach(var tr in trs.Select((trNodes, j) => new { trNodes = trNodes, j = j }))
{
var cellCounter = 0;
foreach(var cell in tr.trNodes.Descendants("th"))
{
items.Add(string.Format("<th> [{0}][{1}][{2}] - {3}", tbs.i, tr.j, cellCounter, cell.InnerText.Trim()));
cellCounter++;
}
foreach (var cell in tr.trNodes.Descendants("td"))
{
items.Add(string.Format("<td> [{0}][{1}][{2}] - {3}", tbs.i, tr.j, cellCounter, cell.InnerText.Trim()));
cellCounter++;
}
}
}
litNumTables.Text = tableNodes.Count().ToString();
rptTrNodes.DataSource = items;
rptTrNodes.DataBind();
}
}
}
它应该是不言自明的,但如果它是您正在寻找的,那么我可以进一步解释。
我是 C# 的初学者,我正在尝试学习如何使用 htmlagility 从网站获取(提取)table 数据,然后在我的应用程序中显示它。
有人知道为什么 .Load 不起作用吗?或者仅通过 UWP 编码不起作用?
编译器说“HtmlWeb”不包含 'Load' 的定义,并且找不到接受类型 'HtmlAgilityPack.HtmlWeb' 的第一个参数的扩展方法 'Load'(您是否缺少using 指令或程序集引用?)。
为什么会这样,如何解决?
public class HtmlWeb{
public HtmlWeb()
{
string Url = "http://google.de";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument document = htmlWeb.Load(Url);
谢谢大家X.L
如前所述,您需要编写自己的 Load(string url)
函数。我很无聊,以前从未听说过 HtmlAgilityPack
,所以我模拟了一些你可以使用的东西。它读取 url http://www.w3schools.com/html/html_tables.asp 并找到所有 <table>
节点,然后遍历它们以找到所有 <td>
和 <th>
节点。然后将所有单元格内部文本写入页面
这是 aspx 页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication5.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>HtmlAgilityPack quasi table parser</title>
</head>
<body>
<h1>Number of tables <asp:Literal ID="litNumTables" runat="server" /></h1>
<strong>Each <th> and <td> node of each <table> [table][row][cell]</strong>
<ul>
<asp:Repeater ID="rptTrNodes" Runat="server">
<ItemTemplate>
<li>
<%# Container.DataItem.ToString() %>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</body>
</html>
这是 C# 代码:
using System;
using System.Linq;
using HtmlAgilityPack;
using System.Net;
using System.Collections.Generic;
namespace WebApplication5
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.w3schools.com/html/html_tables.asp"));
var root = html.DocumentNode;
var tableNodes = root.Descendants("table");
var items = new List<string>();
foreach(var tbs in tableNodes.Select((tbNodes,i) => new { tbNodes = tbNodes, i = i }))
{
items.Add(string.Format("<h2><table> {0}<h2>", tbs.i));
var trs = tbs.tbNodes.Descendants("tr");
foreach(var tr in trs.Select((trNodes, j) => new { trNodes = trNodes, j = j }))
{
var cellCounter = 0;
foreach(var cell in tr.trNodes.Descendants("th"))
{
items.Add(string.Format("<th> [{0}][{1}][{2}] - {3}", tbs.i, tr.j, cellCounter, cell.InnerText.Trim()));
cellCounter++;
}
foreach (var cell in tr.trNodes.Descendants("td"))
{
items.Add(string.Format("<td> [{0}][{1}][{2}] - {3}", tbs.i, tr.j, cellCounter, cell.InnerText.Trim()));
cellCounter++;
}
}
}
litNumTables.Text = tableNodes.Count().ToString();
rptTrNodes.DataSource = items;
rptTrNodes.DataBind();
}
}
}
它应该是不言自明的,但如果它是您正在寻找的,那么我可以进一步解释。