c# - 如何从网页中的链接读取 url 参数的内容?

标签 c# html parsing console-application html-agility-pack

我目前正在使用 HtmlAgilityPack 创建一个 C# 控制台应用程序,我试图在其中获取网页上链接的参数值。所以基本上我有一个网页,在那个页面上有一堆链接。其中一个链接有一个名为“&pagenumber=[some number]”的参数。我想得到的是 &pagenumber= 之后的值并将其保存到一个 int 变量中。

步骤:

  1. 转到网站 ( http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1)

  2. 在页面底部的 url 中查找文本“最后一页”:

<a href="http://forum.tibia.com/forum/?action=board&amp;boardid=25&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=974">Last Page</a>

  1. 从“pagenumber”(本例中为“974”)中获取参数值

  2. 保存到整型变量

到目前为止我的代码:

string PageLink = "http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1";
Task.Run(async () =>
{
    using (var client = new HttpClient())
    {
        // Load the html of the page
        var html = await client.GetStringAsync(PageLink);
        var document = new HtmlAgilityPack.HtmlDocument();
        document.LoadHtml(html);

        // Find the "Last Page" link at bottom of page
        var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"].Value.Contains("&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=")).InnerHtml;

        // Print out the pagenumber value
        Console.WriteLine(lastPageLink);
    }
}).Wait(1000);

但是,我的代码没有打印任何东西,所以我想知道我在这里做错了什么。我没有收到任何错误。我基本上试图找到所有链接(a-tag),我查看它们的“href”值,看看它是否包含“&threadage=-1&pageitems=30&pagenumber=”。如果是,它应该选择它的 html 代码。

所以现在,我希望我的代码打印:http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1&pageitems=30&pagenumber=974

然后我可以继续使用 Regex 或其他东西,以获得“974”。

url 包含“board&boardid=25&threadage=-1”非常重要,因为其中还有其他链接具有“Last Page”值。

最佳答案

var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"] != null && x.Attributes["href"].Value.Contains("&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=")).Attributes["href"].Value;

两个变化,

  1. 我在 lambda 语句的前面添加了 x.Attributes["href"] != null && 以防止在链接没有 href 时出现 NullReferenceException属性。
  2. .InnerHtml 切换为 .Attributes["href"].Value 以打印 URL 而不是 Last Page

解析

var matchingString = "&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=";
var start = lastPageLink.IndexOf(matchingString) + matchingString.Length;
var end = lastPageLink.Length - start;
var pageNumber = lastPageLink.IndexOf(matchingString) >= 0 ? lastPageLink.Substring(start, end) : "Unknown";
Console.WriteLine("Page #: " + pageNumber);

应该能满足您的需求。我不知道正则表达式,所以如果你想使用它,你必须自己弄清楚。

注意:我假设 pagenumber 将是最后一个 url 参数,但这并不总是正确的。因此,如果您使用此代码的目的不仅仅是短期使用,我会相应地对其进行调整。

关于c# - 如何从网页中的链接读取 url 参数的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724114/

相关文章:

java - 如何获取jtable列中的总和

javascript - 不确定如何在我的正则表达式中捕获斜杠符号 "/"

c# - FileInfo 构造函数在短于 256 个字符时报告长文件名

jquery - 限制 HTML 中的用户输入

html - 获取元素的第一次出现,独立于 parent

php - Yii2 两个 submitButtons 去错 URL

c# - 在某个字符之前匹配任何内容的正则表达式?

c# - 球体的透明度不适用于我的立方体的所有侧面 - Helixtoolkit

c# - 可以使用 C# 泛型来省略虚函数调用吗?

c# - 计算多行的平均日期差异