Yahoo! search interface: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(5 intermediate revisions by 5 users not shown)
Line 7:
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program yahoosearch64.s */
Line 373:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 383:
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program yahoosearch.s */
Line 735:
/***************************************************/
.include "../affichage.inc"
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 744:
=={{header|AutoHotkey}}==
translated from python example
<syntaxhighlight lang="autohotkey">test:
<lang AutoHotkey>test:
yahooSearch("test", 1)
yahooSearch("test", 2)
Line 774:
url := regexreplace(url, "<.*?>")
return url
}</langsyntaxhighlight>
 
=={{header|C sharp}}==
Line 780:
E. g. all implementations for this task which regex for
"<a class=" fail by now, after Yahoo has changed its output format.
<langsyntaxhighlight lang="csharp">using System;
using System.Net;
using System.Text.RegularExpressions;
Line 893:
}
}
</syntaxhighlight>
</lang>
 
=={{header|D}}==
{{trans|C#}}
<langsyntaxhighlight lang="d">import std.stdio, std.exception, std.regex, std.algorithm, std.string,
std.net.curl;
 
Line 955:
void main() {
writefln("%(%s\n%)", "test".YahooSearch.results);
}</langsyntaxhighlight>
{{out|Output (shortened)}}
<pre>
Line 973:
 
=={{header|Gambas}}==
<langsyntaxhighlight lang="gambas">Public Sub Form_Open()
Dim hWebView As WebView
 
Line 984:
hWebView.URL = "https://www.yahoo.com"
 
End</langsyntaxhighlight>
'''[http://www.cogier.com/gambas/Yahoo!%20search%20interface.png Click here to see output (I have typed 'rosettacode' in the search box)]'''
 
Line 991:
 
The regular expression used below was figured out by studying the raw HTML and works fine as at 18th November, 2019.
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,053:
fmt.Println(res)
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,105:
=={{header|GUISS}}==
 
<langsyntaxhighlight lang="guiss">Start,Programs,Applications,Mozilla Firefox,Inputbox:address bar>www.yahoo.co.uk,
Button:Go,Area:browser window,Inputbox:searchbox>elephants,Button:Search</langsyntaxhighlight>
 
=={{header|Haskell}}==
Haskell is not an object oriented language, so this example does not implement an object class.
However, it can be interesting as an example of how HTML source code can be parsed using the Parsec library.
<langsyntaxhighlight Haskelllang="haskell">import Network.HTTP
import Text.Parsec
 
Line 1,216:
in [ YahooSearchItem { itemUrl = u, itemTitle = t, itemContent = c } |
(u, t, c) <- zip3 us ts cs ]
</syntaxhighlight>
</lang>
Simple invocation from GHCi: <pre>yahoo "Rosetta%20code" >>= printResults</pre>. Notice that spaces must be expressed as "%20", because spaces are not allowed in URLs.
==Icon and {{header|Unicon}}==
The following uses the Unicon pre-processor and messaging extensions and won't run under Icon without significant modification.
The code provides a suitable demonstration; however, could be made more robust by things such as URL escaping the search string
<langsyntaxhighlight Iconlang="icon">link printf,strings
 
procedure main()
Line 1,263:
urlpat := sprintf("http://search.yahoo.com/search?p=%s&b=%%d",searchtext)
page := 0
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 1,304:
=={{header|Java}}==
{{incorrect|Java}}
<langsyntaxhighlight lang="java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
Line 1,460:
}
}
}</langsyntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">""" Rosetta Code Yahoo search task. https://rosettacode.org/wiki/Yahoo!_search_interface """
 
using EzXML
Line 1,481:
search::String
yahoourl::String
pagesize::Int
currentpage::Int
usedpages::Vector{Int}
results::Vector{SearchResults}
end
YahooSearch(s, url = URI) = YahooSearch(s, pzurl, =1, pagesize)Int[], =SearchResults[])
YahooSearch(s, url, pz, 1, Int[], SearchResults[])
 
function NextPage(yah::YahooSearch, link, pagenum)
Line 1,543 ⟶ 1,541:
println("URL: ", res.url, "\n")
end
</langsyntaxhighlight>{{out}}
<pre>
Searching Yahoo for `RosettaCode`:
Line 1,705 ⟶ 1,703:
URL: https://simple.wikipedia.org/wiki/Rosetta_Code
</pre>
 
 
 
=={{header|Kotlin}}==
{{incorrect|Kotlin}}
This is based on the C# entry but uses a regular expression based on what appears to be the Yahoo! format as at the date of this entry (4 December 2017).
<langsyntaxhighlight lang="scala">// version 1.2.0
 
import java.net.URL
Line 1,755 ⟶ 1,751:
for (result in x.results.take(3)) println(result)
}
}</langsyntaxhighlight>
Output (restricted to first three results on first two pages):
<pre>PAGE 1 =>
Line 1,787 ⟶ 1,783:
=={{header|Mathematica}}/{{header|Wolfram Language}}==
We cannot define a class in Mathematica, so I generate a "Manipulate" object instead.
<syntaxhighlight lang="text">Manipulate[
Column[Flatten[
StringCases[
Line 1,811 ⟶ 1,807:
Row[{Button["Search", page = 1; query = input],
Button["Prev", page -= 10, Enabled -> Dynamic[page >= 10]],
Button["Next", page += 10]}]]</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import httpclient, strutils, htmlparser, xmltree, strtabs
const
PageSize = 7
Line 1,868 ⟶ 1,864:
searchInf.nextPage()
searchInf.echoResult()
</syntaxhighlight>
</lang>
{{out}}
<pre>(url: "https://weather.com/", title: "National and Local Weather Radar, Daily Forecast, Hurricane ...", content: "The Weather Channel and weather.com provide a national and local weather forecast for cities, as well as weather radar, report and hurricane coverage ")
Line 1,894 ⟶ 1,890:
 
We implement some simple parsing with logic programming. Regular expressions in Oz don't seem to support lazy quantification which makes parsing the result pages with them difficult.
<langsyntaxhighlight lang="oz">declare
[HTTPClient] = {Module.link ['x-ozlib://mesaros/net/HTTPClient.ozf']}
[StringX] = {Module.link ['x-oz://system/String.ozf']}
Line 2,040 ⟶ 2,036:
end
in
{ExampleUsage}</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">package YahooSearch;
 
use Encode;
Line 2,110 ⟶ 2,106:
$invocant->{link_to_next} = $next;
$invocant->{results} = $results;
return 1;}</langsyntaxhighlight>
 
=={{header|Phix}}==
{{libheader|Phix/libcurl}}
As noted elsewhere, Yahoo and other search sites will regularly change the output format, so don't be too shocked if this is once again broken. Last fixed 22/4/2022 (with previous left in as comments).
<lang Phix>-- demo\rosetta\Yahoo_search_interface.exw
The glyphs constants do not show up properly on rosettacode, so here they are in plain text, and I even had to edit that by hand:
include builtins\libcurl.e
<pre>
 
constant glyphs = {{"\xC2\xB7 ","*"}, -- bullet point
{"&amp;#39;",`'`}, -- single quote
{"&amp;quot;",`"`}, -- double quote
{"&amp;amp;","&"}, -- ampersand
{"\xE2\x94\xAC\xC2\xAB","[R]"}, -- registered
{"\xC2\xAE","[R]"}}, -- registered
</pre>
{gutf8,gascii} = columnize(glyphs),
<!--<syntaxhighlight lang="phix">(notonline)-->
tags = {{`<a `,`</a>`},
<span style="color: #000080;font-style:italic;">--
{`<b>`,`</b>`},
-- demo\rosetta\Yahoo_search_interface.exw
{`<span class=" fc-2nd">`,`</span>`}}
-- =======================================
 
--</span>
function grab(string txt, opener, closer, integer tdx)
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (libcurl)</span>
integer openidx = match(opener,txt,tdx)
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">libcurl</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
if openidx=0 then return {0,""} end if
integer closeidx = match(closer,txt,openidx)
<span style="color: #008080;">constant</span> <span style="color: #000000;">glyphs</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"\xC2\xB7 "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"*"</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- bullet point</span>
txt = txt[openidx+length(opener)..closeidx-1]
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&#39;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`'`</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- single quote</span>
tdx = 1
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&quot;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`"`</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- double quote</span>
while tdx<=length(tags) do
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&amp;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&"</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- ampersand</span>
{opener,closer} = tags[tdx]
<span style="color: #0000FF;">{</span><span style="color: #008000;">"\xE2\x94\xAC\xC2\xAB"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"[R]"</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- registered</span>
integer i = match(opener,txt)
<span style="color: #0000FF;">{</span><span style="color: #008000;">"\xC2\xAE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"[R]"</span><span style="color: #0000FF;">}},</span> <span style="color: #000080;font-style:italic;">-- registered</span>
if i=0 then
<span style="color: #0000FF;">{</span><span style="color: #000000;">gutf8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gascii</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">(</span><span style="color: #000000;">glyphs</span><span style="color: #0000FF;">),</span>
tdx += 1
<span style="color: #000000;">tags</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">`&lt;a `</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/a&gt;`</span><span style="color: #0000FF;">},</span>
else
<span style="color: #0000FF;">{</span><span style="color: #008000;">`&lt;b&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/b&gt;`</span><span style="color: #0000FF;">},</span>
if opener[$]='>' then
<span style="color: #0000FF;">{</span><span style="color: #008000;">`&lt;span class=" fc-2nd"&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/span&gt;`</span><span style="color: #0000FF;">}}</span>
txt[i..i+length(opener)-1] = ""
else
<span style="color: #008080;">function</span> <span style="color: #000000;">grab</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">opener</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">closer</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">tdx</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">bool</span> <span style="color: #000000;">crop</span><span style="color: #0000FF;">)</span>
txt[i..find('>',txt,i)] = ""
<span style="color: #004080;">integer</span> <span style="color: #000000;">openidx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opener</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">openidx</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
i = match(closer,txt,i)
<span style="color: #004080;">integer</span> <span style="color: #000000;">closeidx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">closer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">openidx</span><span style="color: #0000FF;">)</span>
txt[i..i+length(closer)-1] = ""
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">openidx</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opener</span><span style="color: #0000FF;">)..</span><span style="color: #000000;">closeidx</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
end if
<span style="color: #000000;">tdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
end while
<span style="color: #008080;">while</span> <span style="color: #000000;">tdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tags</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
txt = substitute_all(txt,gutf8,gascii)
<span style="color: #0000FF;">{</span><span style="color: #000000;">opener</span><span style="color: #0000FF;">,</span><span style="color: #000000;">closer</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">]</span>
if length(txt)>80 then txt[78..$] = ".." end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opener</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
return {closeidx+length(closer),txt}
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
end function
<span style="color: #000000;">tdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
 
<span style="color: #008080;">else</span>
procedure YahooSearch(string query, integer page=1)
<span style="color: #008080;">if</span> <span style="color: #000000;">opener</span><span style="color: #0000FF;">[$]=</span><span style="color: #008000;">'&gt;'</span> <span style="color: #008080;">then</span>
printf(1,"Page %d:\n=======\n",page)
<span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opener</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
string url = sprintf("https://search.yahoo.com/search?p=%s&b=%d", {query, (page-1)*10+1})
<span style="color: #008080;">else</span>
object res = curl_easy_perform_ex(url)
<span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'&gt;'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
if not string(res) then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
?{"some error",res,curl_easy_strerror(res)}
<span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">closer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
return
<span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">closer</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
integer rdx = 1
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
string title, link, desc
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gutf8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gascii</span><span style="color: #0000FF;">)</span>
while true do
<span style="color: #008080;">if</span> <span style="color: #000000;">crop</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)></span><span style="color: #000000;">80</span> <span style="color: #008080;">then</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">78</span><span style="color: #0000FF;">..$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">".."</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
{rdx,title} = grab(res,`<h3 class="title ov-h">`,`</h3>`,rdx)
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">closeidx</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">closer</span><span style="color: #0000FF;">),</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">}</span>
if rdx=0 then exit end if
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
{rdx,link} = grab(res,`<span class=" fz-ms fw-m fc-12th wr-bw lh-17">`,`</span>`,rdx)
{rdx,desc} = grab(res,`<p class="fz-ms lh-1_43x">`,`</p>`,rdx)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">YahooSearch</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">query</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">page</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
printf(1,"title:%s\nlink:%s\ndesc:%s\n\n",{title,link,desc})
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Page %d:\n=======\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">page</span><span style="color: #0000FF;">)</span>
end while
<span style="color: #004080;">string</span> <span style="color: #000000;">url</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"https://search.yahoo.com/search?p=%s&b=%d"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">query</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">page</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">10</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">})</span>
end procedure
<span style="color: #000080;font-style:italic;">--?url</span>
 
<span style="color: #004080;">object</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_easy_perform_ex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">url</span><span style="color: #0000FF;">)</span>
YahooSearch("rosettacode")
<span style="color: #000080;font-style:italic;">--?res</span>
YahooSearch("rosettacode",2)</lang>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #004080;">string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">?{</span><span style="color: #008000;">"some error"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">curl_easy_strerror</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)}</span>
<span style="color: #008080;">return</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">rdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">title</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">link</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">desc</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000080;font-style:italic;">-- {rdx,title} = grab(res,`&lt;h3 class="title ov-h"&gt;`,`&lt;/h3&gt;`,rdx)
-- {rdx,title} = grab(res,`&lt;span class=" d-ib p-abs t-0 l-0 fz-14 lh-20 fc-obsidian wr-bw ls-n pb-4"&gt;`,`&lt;/span&gt;`,rdx)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">title</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">grab</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;h3 style="display:block;margin-top:24px;margin-bottom:2px;" class="title"&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/h3&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rdx</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000080;font-style:italic;">-- {rdx,title} = grab(res,`&lt;/span&gt;`,`&lt;/a&gt;`,rdx)
-- title = title[rmatch(`&lt;/span&gt;`,title)+7..rmatch(`&lt;\a&gt;`,title)]</span>
<span style="color: #000000;">title</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">title</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">rmatch</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`&lt;/span&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">title</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">7</span><span style="color: #0000FF;">..$]</span>
<span style="color: #000080;font-style:italic;">-- {rdx,link} = grab(res,`&lt;span class=" fz-ms fw-m fc-12th wr-bw lh-17"&gt;`,`&lt;/span&gt;`,rdx)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">link</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">grab</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;span&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/span&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- {rdx,desc} = grab(res,`&lt;p class="fz-ms lh-1_43x"&gt;`,`&lt;/p&gt;`,rdx)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">desc</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">grab</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;span class=" fc-falcon"&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`&lt;/span&gt;`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"title:%s\nlink:%s\ndesc:%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">title</span><span style="color: #0000FF;">,</span><span style="color: #000000;">link</span><span style="color: #0000FF;">,</span><span style="color: #000000;">desc</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">YahooSearch</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"rosettacode"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">YahooSearch</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"rosettacode"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"done"</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 2,215 ⟶ 2,239:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/http.l")
 
(de yahoo (Query Page)
Line 2,239 ⟶ 2,263:
(T (eof))
(T (= "</div" (till ">" T)))
(char) ) ) ) ) ) ) ) ) ) )</langsyntaxhighlight>
Output:
<pre>: (more (yahoo "test"))
Line 2,249 ⟶ 2,273:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">import urllib
import re
 
Line 2,293 ⟶ 2,317:
for result in x.search_results:
print result.title</langsyntaxhighlight>
 
=={{header|R}}==
Line 2,301 ⟶ 2,325:
 
Rather than using regexes to find the content (like some of the other solutions here) this method parses the HTML and finds the appropriate sections.
<langsyntaxhighlight Rlang="r">YahooSearch <- function(query, page=1, .opts=list(), ignoreMarkUpErrors=TRUE)
{
if(!require(RCurl) || !require(XML))
Line 2,390 ⟶ 2,414:
#Usage
YahooSearch("rosetta code")
nextpage()</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">#lang racket
(require net/url)
(define *yaho-url* "http://search.yahoo.com/search?p=~a&b=~a")
Line 2,421 ⟶ 2,445:
(define (next-page)
(set! *current-page* (add1 *current-page*))
(search-yahoo *current-query*))</langsyntaxhighlight>
 
# REPL:
Line 2,499 ⟶ 2,523:
YahooSearch.rakumod:
 
<syntaxhighlight lang="raku" line>
<lang perl6>
use Gumbo;
use LWP::Simple;
Line 2,555 ⟶ 2,579:
YahooSearch.new($search-term).results.next.results;
}
</syntaxhighlight>
</lang>
 
And the invocation script is simply:
Line 2,566 ⟶ 2,590:
 
Should give out something like the following:
<syntaxhighlight lang="text">
=== #1 ===
Title:
Line 2,579 ⟶ 2,603:
URL: https://video.search.yahoo.com/search/video?p=test
Text: More Test videos
</syntaxhighlight>
</lang>
 
...and should go up to result #21!
Line 2,586 ⟶ 2,610:
{{improve|1=Ruby|2=Should not call <code>URI.escape</code>, because it fails to encode = signs and some other characters that might appear in the term. See [[URL encoding#Ruby]].}}
Uses {{libheader|RubyGems}} {{libheader|Hpricot}} to parse the HTML. Someone more skillful than I at XPath or CSS could tighten up the <code>parse_html</code> method.
<langsyntaxhighlight lang="ruby">require 'open-uri'
require 'hpricot'
 
Line 2,648 ⟶ 2,672:
puts result.content
puts
end</langsyntaxhighlight>
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">'--------------------------------------------------------------------------
' send this from the server to the clients browser
'--------------------------------------------------------------------------
Line 2,688 ⟶ 2,712:
[exit]
cls ' clear browser screen and get outta here
wait</langsyntaxhighlight>
This user input sits at the top of the yahoo page so they can select a new search or page
<div>[[File:yahooSearchRunBasic.png‎]]</div>
Line 2,695 ⟶ 2,719:
{{trans|Python}}
 
<langsyntaxhighlight lang="tcl">package require http
 
proc fix s {
Line 2,732 ⟶ 2,756:
foreach {title content url} [Nextpage] {
puts $title
}</langsyntaxhighlight>
{{works with|Tcl|8.6}}
With Tcl 8.6, more options are available for managing the global state, through objects and coroutines. First, an object-based solution that takes the basic <tt>YahooSearch</tt> functionality and dresses it up to be more Tcl-like:
<langsyntaxhighlight lang="tcl">package require Tcl 8.6
 
oo::class create WebSearcher {
Line 2,768 ⟶ 2,792:
puts "\"$title\" : $url"
}
$ytest delete ;# standard method that deletes the object</langsyntaxhighlight>
However, the paradigm of an iterator is also interesting and is more appropriately supported through a coroutine. This version conceals the fact that the service produces output in pages; care should be taken with it because it can produce rather a lot of network traffic...
<langsyntaxhighlight lang="tcl">package require Tcl 8.6
 
proc yahoo! term {
Line 2,792 ⟶ 2,816:
puts [dict get [$it] title]
after 300 ;# Slow the code down... :-)
}</langsyntaxhighlight>
 
Another approach: uses a class as specified in the task. Also, uses an html parser from tcllib (parsing html with regular expressions is a particular annoyance of [[User:Glennj|mine]]).
Line 2,799 ⟶ 2,823:
{{tcllib|htmlparse}}
{{tcllib|textutil::adjust}}<!-- for formatting output -->
<langsyntaxhighlight lang="tcl">package require Tcl 8.6
package require http
package require htmlparse
Line 2,912 ⟶ 2,936:
puts ""
}
}</langsyntaxhighlight>
 
=={{header|TXR}}==
Line 2,922 ⟶ 2,946:
A little sprinkling of regex is used.
 
<langsyntaxhighlight lang="txr">#!/usr/bin/txr -f
@(next :args)
@(cases)
Line 2,944 ⟶ 2,968:
@ (end)
@(end)
</syntaxhighlight>
</lang>
 
Sample run:
Line 2,992 ⟶ 3,016:
</pre>
 
=={{header|Wren}}==
{{libheader|libcurl}}
{{libheader|Wren-pattern}}
An embedded program so we can use libcurl.
 
A somewhat ''ad hoc'' solution as the output format for Yahoo! search seems to change quite frequently. All I can say is that this worked on 5th January, 2022.
<syntaxhighlight lang="wren">/* Yahoo_search_interface.wren */
 
import "./pattern" for Pattern
 
class YahooSearch {
construct new(url, title, desc) {
_url = url
_title = title
_desc = desc
}
 
toString { "URL: %(_url)\nTitle: %(_title)\nDescription: %(_desc)\n" }
}
 
var CURLOPT_URL = 10002
var CURLOPT_FOLLOWLOCATION = 52
var CURLOPT_WRITEFUNCTION = 20011
var CURLOPT_WRITEDATA = 10001
 
foreign class Buffer {
construct new() {} // C will allocate buffer of a suitable size
 
foreign value // returns buffer contents as a string
}
 
foreign class Curl {
construct easyInit() {}
 
foreign easySetOpt(opt, param)
 
foreign easyPerform()
 
foreign easyCleanup()
}
 
var curl = Curl.easyInit()
 
var getContent = Fn.new { |url|
var buffer = Buffer.new()
curl.easySetOpt(CURLOPT_URL, url)
curl.easySetOpt(CURLOPT_FOLLOWLOCATION, 1)
curl.easySetOpt(CURLOPT_WRITEFUNCTION, 0) // write function to be supplied by C
curl.easySetOpt(CURLOPT_WRITEDATA, buffer)
curl.easyPerform()
return buffer.value
}
 
var p1 = Pattern.new("class/=\" d-ib ls-05 fz-20 lh-26 td-hu tc va-bot mxw-100p\" href/=\"[+1^\"]\"")
var p2 = Pattern.new("class/=\" d-ib p-abs t-0 l-0 fz-14 lh-20 fc-obsidian wr-bw ls-n pb-4\">[+1^<]<")
var p3 = Pattern.new("<span class/=\" fc-falcon\">[+1^<]<")
 
var pageSize = 7
var totalCount = 0
 
var yahooSearch = Fn.new { |query, page|
System.print("Page %(page):\n=======\n")
var next = (page - 1) * pageSize + 1
var url = "https://search.yahoo.com/search?fr=opensearch&pz=%(pageSize)&p=%(query)&b=%(next)"
var content = getContent.call(url).replace("<b>", "").replace("</b>", "")
var matches1 = p1.findAll(content)
var count = matches1.count
if (count == 0) return false
var matches2 = p2.findAll(content)
var matches3 = p3.findAll(content)
totalCount = totalCount + count
var ys = List.filled(count, null)
for (i in 0...count) {
var url = matches1[i].capsText[0]
var title = matches2[i].capsText[0]
var desc = matches3[i].capsText[0].replace("&#39;", "'")
ys[i] = YahooSearch.new(url, title, desc)
}
System.print(ys.join("\n"))
return true
}
 
var page = 1
var limit = 2
var query = "rosettacode"
System.print("Searching for '%(query)' on Yahoo!\n")
while (page <= limit && yahooSearch.call(query, page)) {
page = page + 1
System.print()
}
System.print("Displayed %(limit) pages with a total of %(totalCount) entries.")
curl.easyCleanup()</syntaxhighlight>
<br>
We now embed this script in the following C program, build and run.
<syntaxhighlight lang="c">/* gcc Yahoo_search_interface.c -o Yahoo_search_interface -lcurl -lwren -lm */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include "wren.h"
 
struct MemoryStruct {
char *memory;
size_t size;
};
 
/* C <=> Wren interface functions */
 
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(!ptr) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
 
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
 
void C_bufferAllocate(WrenVM* vm) {
struct MemoryStruct *ms = (struct MemoryStruct *)wrenSetSlotNewForeign(vm, 0, 0, sizeof(struct MemoryStruct));
ms->memory = malloc(1);
ms->size = 0;
}
 
void C_bufferFinalize(void* data) {
struct MemoryStruct *ms = (struct MemoryStruct *)data;
free(ms->memory);
}
 
void C_curlAllocate(WrenVM* vm) {
CURL** pcurl = (CURL**)wrenSetSlotNewForeign(vm, 0, 0, sizeof(CURL*));
*pcurl = curl_easy_init();
}
 
void C_value(WrenVM* vm) {
struct MemoryStruct *ms = (struct MemoryStruct *)wrenGetSlotForeign(vm, 0);
wrenSetSlotString(vm, 0, ms->memory);
}
 
void C_easyPerform(WrenVM* vm) {
CURL* curl = *(CURL**)wrenGetSlotForeign(vm, 0);
curl_easy_perform(curl);
}
 
void C_easyCleanup(WrenVM* vm) {
CURL* curl = *(CURL**)wrenGetSlotForeign(vm, 0);
curl_easy_cleanup(curl);
}
 
void C_easySetOpt(WrenVM* vm) {
CURL* curl = *(CURL**)wrenGetSlotForeign(vm, 0);
CURLoption opt = (CURLoption)wrenGetSlotDouble(vm, 1);
if (opt < 10000) {
long lparam = (long)wrenGetSlotDouble(vm, 2);
curl_easy_setopt(curl, opt, lparam);
} else if (opt < 20000) {
if (opt == CURLOPT_WRITEDATA) {
struct MemoryStruct *ms = (struct MemoryStruct *)wrenGetSlotForeign(vm, 2);
curl_easy_setopt(curl, opt, (void *)ms);
} else if (opt == CURLOPT_URL) {
const char *url = wrenGetSlotString(vm, 2);
curl_easy_setopt(curl, opt, url);
}
} else if (opt < 30000) {
if (opt == CURLOPT_WRITEFUNCTION) {
curl_easy_setopt(curl, opt, &WriteMemoryCallback);
}
}
}
 
WrenForeignClassMethods bindForeignClass(WrenVM* vm, const char* module, const char* className) {
WrenForeignClassMethods methods;
methods.allocate = NULL;
methods.finalize = NULL;
if (strcmp(module, "main") == 0) {
if (strcmp(className, "Buffer") == 0) {
methods.allocate = C_bufferAllocate;
methods.finalize = C_bufferFinalize;
} else if (strcmp(className, "Curl") == 0) {
methods.allocate = C_curlAllocate;
}
}
return methods;
}
 
WrenForeignMethodFn bindForeignMethod(
WrenVM* vm,
const char* module,
const char* className,
bool isStatic,
const char* signature) {
if (strcmp(module, "main") == 0) {
if (strcmp(className, "Buffer") == 0) {
if (!isStatic && strcmp(signature, "value") == 0) return C_value;
} else if (strcmp(className, "Curl") == 0) {
if (!isStatic && strcmp(signature, "easySetOpt(_,_)") == 0) return C_easySetOpt;
if (!isStatic && strcmp(signature, "easyPerform()") == 0) return C_easyPerform;
if (!isStatic && strcmp(signature, "easyCleanup()") == 0) return C_easyCleanup;
}
}
return NULL;
}
 
static void writeFn(WrenVM* vm, const char* text) {
printf("%s", text);
}
 
void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) {
switch (errorType) {
case WREN_ERROR_COMPILE:
printf("[%s line %d] [Error] %s\n", module, line, msg);
break;
case WREN_ERROR_STACK_TRACE:
printf("[%s line %d] in %s\n", module, line, msg);
break;
case WREN_ERROR_RUNTIME:
printf("[Runtime Error] %s\n", msg);
break;
}
}
 
char *readFile(const char *fileName) {
FILE *f = fopen(fileName, "r");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
rewind(f);
char *script = malloc(fsize + 1);
fread(script, 1, fsize, f);
fclose(f);
script[fsize] = 0;
return script;
}
 
static void loadModuleComplete(WrenVM* vm, const char* module, WrenLoadModuleResult result) {
if( result.source) free((void*)result.source);
}
 
WrenLoadModuleResult loadModule(WrenVM* vm, const char* name) {
WrenLoadModuleResult result = {0};
if (strcmp(name, "random") != 0 && strcmp(name, "meta") != 0) {
result.onComplete = loadModuleComplete;
char fullName[strlen(name) + 6];
strcpy(fullName, name);
strcat(fullName, ".wren");
result.source = readFile(fullName);
}
return result;
}
 
int main(int argc, char **argv) {
WrenConfiguration config;
wrenInitConfiguration(&config);
config.writeFn = &writeFn;
config.errorFn = &errorFn;
config.bindForeignClassFn = &bindForeignClass;
config.bindForeignMethodFn = &bindForeignMethod;
config.loadModuleFn = &loadModule;
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "Yahoo_search_interface.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
switch (result) {
case WREN_RESULT_COMPILE_ERROR:
printf("Compile Error!\n");
break;
case WREN_RESULT_RUNTIME_ERROR:
printf("Runtime Error!\n");
break;
case WREN_RESULT_SUCCESS:
break;
}
wrenFreeVM(vm);
free(script);
return 0;
}</syntaxhighlight>
 
{{out}}
Limited to first two pages.
<pre>
Searching for 'rosettacode' on Yahoo!
 
Page 1:
=======
 
URL: https://rosettacode.org/wiki/Rosetta_Code
Title: rosettacode.org
Description: Enjoy amazing savings with our 50% off
 
URL: https://en.wikipedia.org/wiki/Rosetta_Code
Title: en.wikipedia.org
Description: Rosetta Code is a programming chrestomathy site. The idea is to present solutions to the same task in as many different languages as possible, to demonstrate how languages are similar and different, and to aid a person with a grounding in one approach to a problem in learning another.
 
URL: https://raku.org/community/rosettacode/
Title: raku.org
Description: Rosetta Code is a wiki-based programming website with implementations of common algorithms and solutions to various programming problems in many different programming languages. It is named for the Rosetta Stone , which has the same text inscribed on it in three languages, and thus allowed Egyptian hieroglyphs to be deciphered for the first time.
 
URL: https://metacpan.org/dist/RosettaCode/view/bin/rosettacode
Title: metacpan.org
Description: Raku on Rosetta Code. Rosetta Code is a community site that presents solutions to programming tasks in many different languages. It is an excellent place to see how various languages approach the same task, as well as to get a feel for the style and fluent use of each language across a variety of domains.
 
URL: https://simple.wikipedia.org/wiki/Rosetta_Code
Title: simple.wikipedia.org
Description: To install RosettaCode, copy and paste the appropriate command in to your terminal. cpanm. cpanm RosettaCode. CPAN shell. perl -MCPAN -e shell install RosettaCode
 
 
Page 2:
=======
 
URL: https://improbotics.org/rosetta-code/
Title: improbotics.org
Description: Enjoy amazing savings with our 50% off
 
URL: https://en.wikipedia.org/wiki/Rosetta_Code
Title: en.wikipedia.org
Description: Rosetta Code was scheduled to perform at Brighton Fringe 2020 at The Warren: Theatre Box and at Camden Fringe 2020 at The Cockpit Theatre and will return live in 2021. Our show was the subject of a scientific research paper “Rosetta Code: Improv in Any Language“, published at the International Conference on Computational Creativity 2020.
 
URL: https://www.freecodecamp.org/news/rosetta-code-unlocking-the-mysteries-of-the-programming-languages-that-power-our-world-300b787d8401/
Title: www.freecodecamp.org
Description: Rosetta Code is a wiki-based programming website with implementations of common algorithms and solutions to various programming problems in many different programming languages. It is named for the Rosetta Stone , which has the same text inscribed on it in three languages, and thus allowed Egyptian hieroglyphs to be deciphered for the first time.
 
URL: https://raku.org/community/rosettacode/
Title: raku.org
Description: Rosetta Code — unlocking the mysteries of the programming languages that power our world. Peter Gleeson. The original Rosetta Stone, via History.com. It’s no secret that the tech world is dominated by a relatively small pool of programming languages. While exact figures are difficult to obtain (and no doubt vary over time), you could ...
 
URL: https://rosettacode.org/wiki/SHA-256
Title: rosettacode.org
Description: Raku on Rosetta Code. Rosetta Code is a community site that presents solutions to programming tasks in many different languages. It is an excellent place to see how various languages approach the same task, as well as to get a feel for the style and fluent use of each language across a variety of domains.
 
URL: https://twitter.com/rosettacode
Title: twitter.com
Description: SHA-256 is the recommended stronger alternative to SHA-1.See FIPS PUB 180-4 for implementation details.. Either by using a dedicated library or implementing the ...
 
URL: https://deals.usnews.com/coupons/rosetta-stone
Title: deals.usnews.com
Description: We would like to show you a description here but the site won’t allow us.
 
 
Displayed 2 pages with a total of 12 entries.
</pre>
 
{{omit from|Batch File|Does not have network access.}}
{{omit from|Brlcad}}
{{omit from|EasyLang|Does not have network access.}}
{{omit from|Lilypond}}
{{omit from|Locomotive Basic|Does not have network access.}}
9,482

edits