【问题标题】:HtmlAgilityPack.HtmlWeb - scraping from a url with a dot inHtmlAgilityPack.HtmlWeb - 从带有点的网址中抓取
【发布时间】:2013-08-15 12:18:55
【问题描述】:

我正在尝试从网站上抓取一些 html。所有其他 url 都可以工作,但特别是一个会出现问题。网址中有一个点,我无法更改,因为它是别人的网站。

string url = "http://blahblah.com/over-under-2.5" // not the actual url!
HtmlWeb htmlWeb = new HtmlWeb();
var document = htmlWeb.Load(url);

它没有给出任何运行时错误,但返回的文档是空的。

有什么解决办法吗?

【问题讨论】:

  • 你试过http://blahblah.com/over-under-2%2E5
  • 当您在浏览器中打开该 URL 时,它是否有效?
  • blahblah.com/over-under-2%2E5 在浏览器中有效,但在代码中无效。 document.DocumentNode 仍然为空。
  • 输出看起来像有效的 HTML 吗?浏览器可能会“修复”无效的 HTML 并仍然显示它,但 HtmlAgilityPack 可能不接受它\

标签: c# .net html-agility-pack


【解决方案1】:

使用 Uri 类创建您的 URL。

Uri uri = new Uri("http://blahblah.com/over-under-2.5");
HtmlWeb htmlWeb = new HtmlWeb();
var page = htmlWeb.Load(uri.AbsoluteUri);
Console.WriteLine(page.DocumentNode.SelectSingleNode("//*[@id=\"currentpage\"]").InnerText);

将从网页输出“BLAH”。

【讨论】:

  • 当我尝试 uri.AbsoluteUri 与原始字符串相同时
  • 所以如果检查 uri.AbsoluteUri 你会得到什么?我的是blahblah.com/over-under-2.5,和传入构造函数的一样。
  • 是的,但是你的结果是什么?这次您传递的是 uri 对象,而不是 URL 的字符串表示形式。有区别。
  • 但是 uri.AbsoluteUri 是一个字符串。如果您可以直接传入 uri 但没有接受对象的 Load 方法,那么您所说的将是正确的。我得到相同的结果(空引用),因为我在您的代码中传递的字符串是相同的。
【解决方案2】:

你可以通过以下方式逃避 Uris:

string escapedString = Uri.EscapeUriString(unescapedString);

不过,我可能完全错过了你的问题的重点。

【讨论】:

  • 我认为它也会逃脱.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2018-06-09
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多