How to generate full URLs from incomplete URLs found on a web page?
I can get the text of a webpage, say this StackOverflow question with some real and generated links:
/ questions
/ tags
/ questions? sort = votes
/ questions? sort = active
randompage.aspx
../coolhomepage.aspx
Knowing my original page was this StackOverflow question , is there a way in .Net to resolve links to this?
/ questions
https://stackoverflow.com/tags
/ questions? sort = votes
/ questions? sort = active
/questionsrandompage.aspx
https://stackoverflow.com/coolhomepage.aspx
It's like the browser is smart enough to allow links.
================================================== ================================================== ================================================== ================================================== ===============================================
'Regex to match all <a ... /a> links
Dim myRegEx As New Regex ("\ <\ s * a (? # Find opening <a tag)" & _
". +? href \ s * = \ s * ['" "] (? # Then all to href =' or" ")" & _
"(? <href>. *?) ['" "] (? # Then all to the next' or" ")" & _
". *? \> (? # Then all to>)" & _
"(? <name>. *?) \ <\ s * / a \ s * \> (? # Then all to </a>)", _
RegexOptions.IgnoreCase Or _
RegexOptions.IgnorePatternWhitespace Or _
RegexOptions.Multiline)
'MatchCollection to hold all the links that are matched
Dim myMatchCollection As MatchCollection
myMatchCollection = myRegEx.Matches (Me._RawPageText)
'Loop through all matches and evaluate the value of the href attribute.
For i As Integer = 0 To myMatchCollection.Count - 1
Dim thisLink As String = ""
thisLink = myMatchCollection (i) .Groups ("href"). Value ()
'This checks for Javascript and Mailto links.
'This is not complete. There are others to check I just haven't encountered them yet.
If thisLink.ToLower.StartsWith ("javascript") Then
thisLink = "JAVASCRIPT:" & thisLink
ElseIf thisLink.ToLower.StartsWith ("mailto") Then
thisLink = "MAILTO:" & thisLink
Else
Dim baseUri As New Uri (Me.URL)
If Not thisLink.ToLower.StartsWith ("http") Then
'This is a partial URL so we will assume that it relative to our originating URL
Dim myUri As New Uri (baseUri, thisLink)
thisLink = "RELATIVE LOCAL LINK: RESOLVED:" & myUri.ToString () & "ORIGINAL:" & thisLink
Else
'The link starts with HTTP, determine if part of base host or is outside host.
Dim ThisUri As New Uri (thisLink)
If ThisUri.Host.ToLower = baseUri.Host.ToLower Then
thisLink = "INSIDE COMPLETE LINK:" & thisLink
Else
thisLink = "OUTSIDE LINK:" & thisLink
End If
End If
End If
'I'm storing the found links into a Generic.List (Of String)
'This link has descriptive text added to it.
'TODO: Make collection to hold only unique internal links.
Me._Links.Add (thisLink)
Next
+1
a source to share
3 answers
Do you mean this?
Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");
Console.WriteLine(myUri.ToString());
The sample comes from http://msdn.microsoft.com/en-us/library/9hst1w91.aspx
+2
a source to share