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

时间:2018-06-06 15:25:18

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

我目前正在使用HtmlAgilityPack创建一个C#控制台应用程序,我正在尝试获取网页上链接的参数值。所以基本上我有一个网页,在那个页面上有一堆链接。其中一个链接有一个名为&#34; &pagenumber=&#34;的参数。我想要获得的是<a href="http://forum.tibia.com/forum/?action=board&amp;boardid=25&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=974">Last Page</a>之后的值,并将其保存到int变量。

步骤:

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

  2. 查找文字&#34;最后一页&#34;在页面底部的网址中:

  3. 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);

    1. 从&#34; pagenumber&#34;中抓取参数值(在这种情况下&#34; 974&#34;)

    2. 将其保存为整数变量

    3. 到目前为止我的代码:

      http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1&pageitems=30&pagenumber=974

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

      所以现在,我希望我的代码可以打印:abcd efgh ijkl mnop qrst uvwx

      然后我可以继续使用正则表达式或其他东西来获得&#34; 974&#34;。

      网址包含&#34; board&amp; boardid = 25&amp; threadage = -1&#34;非常重要,因为还有其他链接与&#34;最后一页&#34;它的价值。

1 个答案:

答案 0 :(得分:1)

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以打印网址,而不是Last Page
  3. <强>解析

    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参数,并不总是如此。因此,如果您使用此代码的不仅仅是短期使用,我会相应地进行调整。