【问题标题】:How can I read the content of a url parameter from a link in a webpage?如何从网页中的链接中读取 url 参数的内容?
【发布时间】:2018-11-16 08:36:29
【问题描述】:

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

步骤:

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

  2. 在页面底部的 url 中查找文本“Last Page”:

<a href="http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1&pageitems=30&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("&threadage=-1&pageitems=30&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

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

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

【问题讨论】:

  • Task.Run(async () =>...).Wait(1000); 看起来不对。不确定这是否是您的问题的原因。我猜你已经这样做了,因为你的控制台需要一个非异步钩子。这样做this way instead
  • 首先我需要获取值。所以我现在什至不会关注 .Wait() 。关键是,我无法从链接中获得任何价值。我想弄清楚我在那里做错了什么。我不应该寻找“a”链接,看看“href”是否包含该文本,然后返回整个href值吗?
  • 如果我运行这段代码,任务会抛出空引用异常,因为在很多情况下x.Attributes["href'] 是空的。

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


【解决方案1】:
var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"] != null && x.Attributes["href"].Value.Contains("&threadage=-1&pageitems=30&pagenumber=")).Attributes["href"].Value;

两个变化,

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

解析

var matchingString = "&threadage=-1&pageitems=30&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 参数,这并不总是正确的。因此,如果您使用此代码不仅仅是短期使用,我会相应地对其进行调整。

【讨论】:

  • 我正在尝试获取最后一页的 href。不是实际的文本“最后一页”,而是链接。更准确地说,我试图在那个href中获得“&pagenumber =”之后的值。但我想第一步是获取完整链接。
  • 编辑:我看到你更新了你的帖子。效果很好!谢谢!现在我得到了完整的href。现在我只需要尝试找到 pagenumber 值。有没有办法直接在相同的代码中做到这一点?还是我需要将href值存储到一个字符串中,然后使用Regex查找pagenumber=XXXXX
  • 所以基本上,在这种情况下,我试图将“974”作为输出。而不是整个 href 值
  • @LeeCheung 是的,如果您想使用正则表达式,您只需获取 URL 的字符串版本(即lastPageLink)并运行它。
  • 我设法用这条线得到了它:var lastPageValue = lastPageLink.Split('=').Last();
猜你喜欢
  • 2012-09-06
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2019-12-11
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多