2

我正在研究通用网店刮刀,遇到了奇怪的问题。实际上,我需要网页上列出的所有产品的正确 URL。大多数时候,这些产品的 href 是相对的。

我正在使用新的 Uri 方法来创建完整的产品 URL。

new Uri (base, href) 

//this actually decide to add "/" before product href

href = x.ProductHref.IsUrlAbsolute() ? x.ProductHref : ((x.ProductHref.StartsWith("/") || (x.ProductHref.StartsWith("."))) ? x.ProductHref : "/" + x.ProductHref)

失败的结果:如何纠正这个

Base URL: "www.bebitalia.it/Products/ProductList_it.html#filter&.CHAISE_LONGUE"
Product href: Product-landscape-chaise_longue_118_it.html
Result : http://www.bebitalia.it/Product-landscape-chaise_longue_118_it.html ==> Status Wrong
Expected:  http://www.bebitalia.it/Products/Product-landscape-chaise_longue_118_it.html

我试图纠正它,但它不适用于其他人:)。想让它通用。请提出任何解决方案,我需要正确的方向或更好的方法。

4

3 回答 3

1

伙计们,我解决了它。现在它是通用的,适用于所有场景。

PageURL 是基本 url

href = (x.ProductHref.IsUrlAbsolute() || (!x.ProductHref.Contains("/") && !PageUrl.AbsoluteUri.EndsWith("/")) ? x.ProductHref : ( (x.ProductHref.StartsWith( "/") || (x.ProductHref.StartsWith("."))) ? x.ProductHref : "/" + x.ProductHref))

Url = 新的 Uri(PageUrl, href)

我提取了一条规则=>如果基本 url 不以“/”结尾,并且 productURL(relative) 也不包含“/”而 base 是绝对的,那么永远不要将“/”添加到 relative。

我不知道浏览器如何自动解决这种情况。它必须在创建新 uri (base,relative) 时自动解决。

于 2013-06-19T13:22:03.883 回答
0

Any link that starts with a / is treated as being in the root of the domain. So first, I'll reformat your code for clarity:

href = x.ProductHref.IsUrlAbsolute() 
       ? x.ProductHref 
       : (x.ProductHref.StartsWith("/") || (x.ProductHref.StartsWith("."))
            ? x.ProductHref 
            : "/" + x.ProductHref;

Reducing this to how it evaluates:

href = false 
       ? // Nothing 
       : (false || false)
            ? // Nothing 
            : "/" + "Product-landscape-chaise_longue_118_it.html";

That produces the URL /Product-landscape-chaise_longue_118_it.html, which starts with a / and so is in the root of your domain.

How you fix this is entirely determined by the rest of your code, which you didn't provide, so I can't offer any suggestions.

于 2013-06-14T14:49:16.563 回答
0

你应该知道如果你href在 new Uri() 之后改变,它不会改变结果,但我认为它是在你调用构造函数之前。

什么是基础?www.bebitalia.it/Products/ProductList_it.html#filter&.CHAISE_LONGUE不是有效的Uri,并且Uri没有带有 2 个字符串参数的构造函数。

如果 href 是绝对的,构造函数new Uri(Uri,String)将自动处理它,并放置它/。它还将在 TLD 之后切断基本 Uri 的所有内容(这可能就是您的代码中发生的情况)。

这里你可以看到它是如何工作的(它是 MSDN 示例)

于 2013-06-14T14:58:27.137 回答