Dünyanın En Küçük Web Tarayıcısı


72

backstory:

Mega-multi-şirkette yeni programlama işinizden hoşlanıyorsunuz. Ancak, bilgisayarınızda yalnızca CLI bulunduğundan web'e göz atmanıza izin verilmez. Ayrıca tüm çalışanların sabit disklerini de tararlar, böylece büyük bir CLI web tarayıcısı indiremezsiniz. Basit bir metinsel tarayıcıyı mümkün olduğunca küçük yapmaya karar verdiniz, böylece onu ezberleyebilir ve her gün geçici bir dosyaya yazabilirsiniz.

Meydan okuma:

Göreviniz bir komut satırı arayüzü içinde golf bir web tarayıcısı oluşturmaktır. Olması gerekiyor:

  • Args veya stdin ile tek bir URL al
  • URL'nin directoryve hostbileşenlerini bölme
  • hostSöz konusu istekte bulunmak için basit bir HTTP isteği gönderdirectory
  • <p>Paragraf </p>etiketlerinin içeriğini yazdır
  • Ve çıkın veya başka bir sayfa isteyin

Daha fazla bilgi:

Basit bir HTTP isteği şöyle görünür:

GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n

Yeni satırları sonlandırmak vurgulandı.

Tipik bir tepki şöyle görünür:

HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page

Kurallar:

  • Yalnızca 80 numaralı bağlantı noktasında çalışması gerekiyor (SSL gerekli değil)
  • Netcat kullanamazsınız
  • Hangi programlama dili kullanılırsa kullanılsın, sadece düşük seviyeli TCP API'lerine izin verilir (netcat hariç)
  • Sen olabilir değil bu bir CLI Unutma, GUI kullanmak
  • Yerleşik olanlar dışında, HTML ayrıştırıcıları kullanamazsınız (BeautifulSoup bir yerleşik değil)
  • Bonus!! Programınız geri döner ve çıkmak yerine başka bir URL isterse, -40 karakter (özyinelemeyi kullanmadığınız sürece)
  • Üçüncü taraf programları yok. Unutma, hiçbir şey yükleyemezsin.
  • , yani en kısa bayt sayısı kazanır

7
Python,import webbrowser;webbrowser.open(url)
Mavi

8
@muddyfish kurallarını okumak
TheDoctor

4
Bunu test etmek için bir tür örnek web sayfası sağlayabilir misiniz? <p> kullanan yerleri bulmak zor: P
bir spaghetto


3
Düşük seviyeli soket arayüzleri ile ilgili kısıtlama , TCP seviyeli API'leri olan çoğu dilin TCP seviyeli API'lerini yasaklıyor gibi görünmektedir.
Peter Taylor

Yanıtlar:


63

Saf Bash (yardımcı program yok), 200 bayt - 40 bonus = 160

while read u;do
u=${u#*//}
d=${u%%/*}
exec 3<>/dev/tcp/$d/80
echo "GET /${u#*/} HTTP/1.1
host:$d
Connection:close
">&3
mapfile -tu3 A
a=${A[@]}
a=${a#*<p>}
a=${a%</p>*}
echo "${a//<\/p>*<p>/"
"}"
done

Bence bu özelliğe bağlı, tabii ki regex kullanarak HTML'yi ayrıştırmak için dikkat etmeyi düşünüyorum. Regex kullanarak HTML'yi ayrıştırmaktan daha kötü olan tek şey, kabuk deseni eşleme kullanarak HTML'yi ayrıştırmak olduğunu düşünüyorum.

Bu şimdi <p>...</p>yayılan birden fazla satır ile ilgilidir. Her <p>...</p>biri ayrı bir çıktı satırında:

$ echo "http://example.com/" | ./smallbrowse.sh
This domain is established to be used for illustrative examples in documents. You may use this     domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
$ 

35
Bunu yarına kadar ezberlemelisin.
Conor O'Brien

14
+ "Kabuk deseni eşleştirmesini kullanarak HTML'yi ayrıştırma" için + ∞
SztupY

76
-1, avatarınız bilinçaltı mesajlaşma olduğu için
TheDoctor

1
... Bash'den TCP bağlantısı kurabilir misiniz? Şimdi gerçekten çok korkuyorum!
Matematiksel

2
Not: /dev/tcpisteğe bağlı bir uzantıdır ve bash'ınızda bulunmayabilir. Sahip --enable-net-redirectionsolmak için birlikte derlemeniz gerekir.
Chris Down,

21

PHP, 175 bayt (215 - 40 bonus) 227 229 239 202 216 186 bayt

İnternette gezinirken eğlenin:

for(;$i=parse_url(trim(fgets(STDIN))),fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1
Host:$h
Connection:Close

");preg_match_all('!<p>(.+?)</p>!si',stream_get_contents($f),$r),print join("
",$r[1])."
");

URL’leri STDINbenzerlerinden okur http://www.example.com/. " \n" Satırsonu ile ayrılan paragrafları çıkarır .


Ungolfed

for(; $i=parse_url(trim(fgets(STDIN))); ) {
    $h = $i['host'];
    $f = fsockopen($h, 80);

    fwrite($f, "GET " . $i['path'] . " HTTP/1.1\nHost:" . $h . "\nConnection:Close\n\n");

    $c = stream_get_contents($f)

    preg_match_all('!<p>(.+?)</p>!si', $c, $r);
    echo join("\n", $r[1]) . "\n";
}

Yalnızca bir URL'yi destekleyen ilk sürüm

$i=parse_url($argv[1]);fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1\nHost:$h\nConnection:Close\n\n");while(!feof($f))$c.=fgets($f);preg_match_all('!<p>(.+?)</p>!sim',$c,$r);foreach($r[1]as$p)echo"$p\n";

görüntü tanımını buraya girin


Düzenlemeler

  • Braintist yorumlarında da belirtildiği gibi , yolu eklemeyi unuttum. Şimdi düzeltildi, teşekkürler. 30 bayt eklendi .
  • Kaydedilen 3 bayt sıfırlayarak $cile (sayfa içeriğini bulundurur) $c=$i=parse_url(trim(fgets(STDIN)));yerine $c=''.
  • Kaydedilen 12 bayt yerine \nyeni hat (5 bayt), bir ile while-loop ile for, (2 byte) ifadelerine neredeyse her şeyi yerleştirmek for(2 byte) ve değiştirilmesi ile foreachbirlikte join(3 bayt). Blackhole'a teşekkürler .
  • Kaydedilen 3 bayt değiştirerek fgetsile stream_get_contentskarşı teşekkür bwoebi .
  • Artık gerekmediğinden yeniden başlatmayı kaldırarak 5 bayt kurtarıldı .$c $c
  • Desen değiştiriciyi Regex'ten kaldırarak 1 bayt kaydedildim . İnsan işi sayesinde


1
@briantist Ah dostum, bunu tamamen özledim. : D Teşekkürler, şimdi düzeltildi.
insertusernamehere

1
Perl'in PHP'yi yenmesine dayanamıyorum, bu yüzden unutma: whilegolf oynamak yasaktır ( forgenellikle daha kısadır ama daha uzun değildir) ve yeni bir satır yapmak için enter tuşuna basın (2 yerine 1 byte \n)! İşte (test edilmemiş) kodunuz biraz daha golf oynadı (227 byte), yeni satırın yerini aldı :for(;$c=$i=parse_url(trim(fgets(STDIN))),fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1↵Host:$h↵Connection:Close↵↵");preg_match_all('!<p>(.+?)</p>!sim',$c,$r),print join('↵',$r[1]).'↵')for(;!feof($f);)$c.=fgets($f);
Blackhole

1
Bir " fordöngü" her zaman bir whiledöngüden daha iyidir , çünkü "kurallara aykırı" olarak "yasak" demek istemiyorum, bunun faydası olmadığını söylüyorum.
Karadelik

1
@MichaelDibbets Aslında ben zaten düzenlemede yazıldığı gibi yaptım. Hm. Bir bakayım. Haha, son parçacığı kopyalamayı ve saymayı unuttum. Duh : D Kahvaltıdan önce kodunuzu güncellerseniz böyle şeyler olur. Gösterdiğin için teşekkürler.
insertusernamehere 27:15

14

Perl, 132 bayt

-ln -MIO::SocketURL'leri sürekli sormak için 155 bayt kodu - 17 - 40

@ DigitalTrauma'nın cevabında olduğu gibi, HTML'yi düzenli olarak düzenleyin, kabul edilebilir değilse bana bildirin. URL'leri daha fazla ayrıştırmaya devam etmiyor ... Buna daha sonra bakacağım ... Yine de Bash'e yakın! @ Büyük teşekkür Schwern ve @ bana 59 (!) Bayt kaydetmek için skmrx bonus bir iddiayı izin hatayı düzeltmeye yönelik!

m|(http://)?([^/]+)(/(\S*))?|;$s=new IO::Socket::INET"$2:80";print$s "GET /$4 HTTP/1.1
Host:$2
Connection:close

";local$/=$,;print<$s>=~m|<p>(.+?)</p>|gs

kullanım

$perl -ln -MIO::Socket -M5.010 wb.pl 
example.com
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.<a href="http://www.iana.org/domains/example">More information...</a>
example.org
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.<a href="http://www.iana.org/domains/example">More information...</a>

Bir hatayı düzelttim ve $ h ve $ p bildirme ihtiyacını ortadan kaldırarak ya da varsayılan bir yolu olma ihtiyacını ortadan kaldırarak kodu kısalttım. Ayrıca artık bir ana bilgisayar üzerinde / izini gerektirmez.
Schwern,

1
Şimdi yenen biziz. :)
Schwern

Sanırım gece işim bitti. :)
Schwern

Komut dosyası çıkmak yerine başka bir URL istediğinden, ek bir -40 bayt talep edebilirsiniz
svsd

1
@DigitalTrauma gerçekten haklısın! Skmrx'e '$ /' ile hatamı düzelttiği için teşekkür ettim, Schwern olmasaydı senin yanında olmazdım!
Dom Hastings

13

PowerShell, 315 294 268 262 254 bayt

355 334 308 302 294 - 40 hızlı

$u=[uri]$args[0]
for(){
$h=$u.Host
$s=[Net.Sockets.TcpClient]::new($h,80).GetStream()
$r=[IO.StreamReader]::new($s)
$w=[IO.StreamWriter]::new($s)
$w.Write("GET $($u.PathAndQuery) HTTP/1.1
HOST: $h

")
$w.Flush()
($r.ReadToEnd()|sls '(?s)(?<=<p>).+?(?=</p>)'-a).Matches.Value
[uri]$u=Read-Host
}

PowerShell v5 gerektirir

Tüm satır sonları (dizeye dahil olanlar dahil) yalnızca PowerShell tarafından tam olarak desteklenen yeni satırlardır \n(teşekkürler Blackhole ) (ancak test ediyorsanız dikkatli olun; ISE kullanır \r\n).


4
Sunucumun yönetici görevlerini daha verimli yapmak için +1
15'ten

HTTP, LF'yi değil CRLF'yi gerektirir! [ HTTPSYNTAX ]
Diş Fırçası,

2
@toothbrush Ha! Puan alınmış, ancak tolerans hükümleri tam anlamıyla etkili görünüyor. Açıkçası bu görev neyin işe yarayacağı ve neyin doğru olduğu ile ilgili değildir (aksi halde HTML'yi regex ile ayrıştırmaz ve iyi test edilmiş mevcut kütüphaneler yerine düşük seviyeli TCP kitaplıkları kullanırız).
briantist

1
@briantist greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.5 "bir alıcı bir satır sonlandırıcı olarak tek bir LF'yi tanıyabilir ve önceki herhangi bir CR'yi görmezden gelebilir" diyor. Çoğu web sunucusunun bunu uygulayacağı anlamını okudum ve soru kesinlikle doğru GET talepler üretmesi gerektiğini söylemiyor … :)
Toothbrush

8

Groovy komut dosyası, 89 , 61 bayt

Bonus 101 - 40 = 61 için geri dönün

System.in.eachLine{l->l.toURL().text.findAll(/<p>(?s)(.*?)<\/p>/).each{println it[3..it.length()-5]}}

Sadece args ile, 89 bayt

this.args[0].toURL().text.findAll(/<p>(?s)(.*?)<\/p>/).each{println it[3..it.length()-5]}

1
Harika, herkesi kızdı. Olması gerektiği gibi.
bir

1
@quartata Bu şekilde kalırsa, ilk defa olacak , yani ...;)
Geobits 28:15

11
"yalnızca düşük seviyeli TCP API'lerine izin verilir"
Digital Trauma

Evet, @DigitalTrauma ile bunun düşük seviyeli bir TCP API kullanmayacağına katılıyorum. Kurallar, ana bilgisayarı ve yolu kendi başınıza ayırmanız gerektiğini belirtir.
Doktor

6

Bash (hile yapıyor olabilir ama kurallar dahilinde gözüküyor) 144-40 = 105

while read a;do
u=${a#*//}
d=${u%%/*}
e=www.w3.org
exec 3<>/dev/tcp/$d/80
echo "GET /services/html2txt?url=$a HTTP/1.1
Host:$d
">&3
cat <&3
done

Dijital Travma sayesinde.

URL'yi bölmem gerekmediğinden, bu da çalışır: 122-40 = 82

while read a;do
d=www.w3.org
exec 3<>/dev/tcp/$d/80
echo "GET /services/html2txt?url=$a HTTP/1.1
Host:$d
">&3   
cat <&3
done

8
Bu çevrimiçi html2txt dönüştürücüyü kullanmanın standart bir boşluk
Digital Trauma

1
Evet. Ve ayrıca kedi kullanıyorum, böylece çözümünüz güvende olsun.
philcolbourn

5

C 512 Bayt

#include <netdb.h>
int main(){char i,S[999],b[99],*p,s=socket(2,1,0),*m[]={"<p>","</p>"};long n;
gets(S);p=strchr(S,'/');*p++=0;struct sockaddr_in a={0,2,5<<12};memcpy(&a.
sin_addr,gethostbyname(S)->h_addr,4);connect(s,&a,16);send(s,b,sprintf(b,
"GET /%s HTTP/1.0\r\nHost:%s\r\nAccept:*/*\r\nConnection:close\r\n\r\n",p,S),0);
p=m[i=0];while((n=recv(s,b,98,0))>0)for(char*c=b;c<b+n;c++){while(*c==*p &&*++p)
c++;if(!*p)p=m[(i=!i)||puts("")];else{while(p>m[i]){if(i)putchar(c[m[i]-p]);p--;}
if(i)putchar(*c);}}} 

Buradaki girişime gevşek bir şekilde dayanarak , web adresini öncü bir "https: //" olmadan alır. İç içe <p>çiftleri doğru işlemez :(

Kapsamlı bir şekilde test edilmiştir www.w3.org/People/Berners-Lee/
Derlendiğinde çalışır Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
. Başka hiçbir yerde çalışamayacağı konusunda tanımsız bir şekilde davranışı vardır.


Kabaca aynı parçadan aşağı iniyordum (bu, gcc ile derlendiğinde ortaya çıkıyor), ancak C'de 400 baytın altına düşmek mümkün olmalıydı. Clang'dan emin değilsiniz, ancak ana geri dönüş türünü bildirmeniz gerekmez. Ayrıca include dosyasını kaldırabilir ve yapılara tamsayı dizileri olarak erişebilirsiniz. Ayrıca "GET /% s HTTP / 1.1 \ r \ n \ r \ n \" ile ilgili yanıtlar alıyorum, ancak siteye göre değişiklik gösterebilecek kilometreler ...
Comintern

5

Ruby, 118

147 bayt kaynak; 11 bayt ' -lprsocket'; Döngü için -40 bayt.

*_,h,p=$_.split'/',4
$_=(TCPSocket.new(h,80)<<"GET /#{p} HTTP/1.1
Host:#{h}
Connection:close

").read.gsub(/((\A|<\/p>).*?)?(<p>|\Z)/mi,'
').strip

Kullanım örneği:

$ ruby -lprsocket wb.rb
http://example.org/
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
http://www.xkcd.com/1596/
Warning: this comic occasionally contains strong language (which may be unsuitable for children), unusual humor (which may be unsuitable for adults), and advanced mathematics (which may be unsuitable for liberal-arts majors).

This work is licensed under a
<a href="http://creativecommons.org/licenses/by-nc/2.5/">Creative Commons Attribution-NonCommercial 2.5 License</a>.


This means you're free to copy and share these comics (but not to sell them). <a rel="license" href="/license.html">More details</a>.

4

AutoIt , 347 bayt

Func _($0)
$4=StringTrimLeft
$0=$4($0,7)
$3=StringSplit($0,"/")[1]
TCPStartup()
$2=TCPConnect(TCPNameToIP($3),80)
TCPSend($2,'GET /'&$4($0,StringLen($3))&' HTTP/1.1'&@LF&'Host: '&$3&@LF&'Connection: close'&@LF&@LF)
$1=''
Do
$1&=TCPRecv($2,1)
Until @extended
For $5 In StringRegExp($1,"(?s)\Q<p>\E(.*?)(?=\Q</p>\E)",3)
ConsoleWrite($5)
Next
EndFunc

Test yapmak

Giriş:

_('http://www.autoitscript.com')

Çıktı:

You don't have permission to access /error/noindex.html
on this server.

Giriş:

_('http://www.autoitscript.com/site')

Çıktı:

The document has moved <a href="https://www.autoitscript.com/site">here</a>.

Uyarılar

  • İç içe <p>etiketleri desteklemiyor
  • Yalnızca <p>etiketleri destekler (büyük / küçük harfe duyarsız), diğer tüm etiket biçimlerini bozar
  • Herhangi bir hata oluştuğunda panik süresiz olarak döngüler

4

C #, 727 Bayt - 40 = 687 Bayt

using System.Text.RegularExpressions;class P{static void Main(){a:var i=System.Console.ReadLine();if(i.StartsWith("http://"))i=i.Substring(7);string p="/",h=i;var l=i.IndexOf(p);
if(l>0){h=i.Substring(0,l);p=i.Substring(l,i.Length-l);}var c=new System.Net.Sockets.TcpClient(h,80);var e=System.Text.Encoding.ASCII;var d=e.GetBytes("GET "+p+@" HTTP/1.1
Host: "+h+@"
Connection: close

");var s=c.GetStream();s.Write(d,0,d.Length);byte[]b=new byte[256],o;var m=new System.IO.MemoryStream();while(true){var r=s.Read(b,0,b.Length);if(r<=0){o=m.ToArray();break;}m.Write(b,0,r);}foreach (Match x in new Regex("<p>(.+?)</p>",RegexOptions.Singleline).Matches(e.GetString(o)))System.Console.WriteLine(x.Groups[1].Value);goto a;}}

Bu biraz eğitim ama kesinlikle unutulmaz bir şey :)

İşte bir ungolfed versiyonu:

using System.Text.RegularExpressions;
class P
{
    static void Main()
    {
    a:
        var input = System.Console.ReadLine();
        if (input.StartsWith("http://")) input = input.Substring(7);
        string path = "/", hostname = input;
        var firstSlashIndex = input.IndexOf(path);
        if (firstSlashIndex > 0)
        {
            hostname = input.Substring(0, firstSlashIndex);
            path = input.Substring(firstSlashIndex, input.Length - firstSlashIndex);
        }
        var tcpClient = new System.Net.Sockets.TcpClient(hostname, 80);
        var asciiEncoding = System.Text.Encoding.ASCII;
        var dataToSend = asciiEncoding.GetBytes("GET " + path + @" HTTP/1.1
Host: " + hostname + @"
Connection: close

");
        var stream = tcpClient.GetStream();
        stream.Write(dataToSend, 0, dataToSend.Length);
        byte[] buff = new byte[256], output;
        var ms = new System.IO.MemoryStream();
        while (true)
        {
            var numberOfBytesRead = stream.Read(buff, 0, buff.Length);
            if (numberOfBytesRead <= 0)
            {
                output = ms.ToArray();
                break;
            }
            ms.Write(buff, 0, numberOfBytesRead);
        }
        foreach (Match match in new Regex("<p>(.+?)</p>", RegexOptions.Singleline).Matches(asciiEncoding.GetString(output)))
        {
            System.Console.WriteLine(match.Groups[1].Value);
            goto a;
        }
    }
}

Gördüğünüz gibi, bonus olarak bellek sızıntısı sorunları var :)


Hafıza sızıntısı nerede? usingAkarsuların çevresinde hiçbir açıklama görmüyorum, ancak bu bir sızıntı yapmıyor.
Gusdor

Birkaç baytı daha kırpabilirsiniz: input = input.trimStart ("http: //"), "if" yan tümcesinin yerine geçecek ve doğrudan System.Text.Encoding.ASCII.GetBytes () yöntemini kullanmadan kullanabilmelisiniz. önce asciiEncoding içinde saklamak için. Bence bir "Kullanma Sistemiyle" öne çıkacaksınız bile. Hat ve "System" bir avuç kurtulmak.
minnmass

3

JavaScript (DüğümJS) - 187 166

s=require("net").connect(80,p=process.argv[2],_=>s.write("GET / HTTP/1.0\nHost: "+p+"\n\n")&s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/g,(_,g)=>console.log(g))));

187:

s=require("net").connect(80,p=process.argv[2],_=>s.write("GET / HTTP/1.1\nHost: "+p+"\nConnection: close\n\n")&s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/gm,(_,g)=>console.log(g))));

Kullanımı:

node file.js www.example.com

Veya biçimlendirilmiş

var url = process.argv[2];
s=require("net").connect(80, url ,_=> {
     s.write("GET / HTTP/1.1\nHost: "+url+"\nConnection: close\n\n");
     s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/gm,(_,g)=>console.log(g)))
});

1
Uyarı: Bu küçük sayfalar için işe yarar - daha büyük sayfalar çoklu veri olayları yayar.
Benjamin Gruenbaum

3

Python 2 - 212 209 bayt

import socket,re
h,_,d=raw_input().partition('/')
s=socket.create_connection((h,80))
s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h))
p=''
while h:h=s.recv(9);p+=h
for g in re.findall('<p>(.*?)</p>',p):print g

İki nokta bayttan while h:önce ve sonra kolondan sonra boşluk bırakarak tasarruf edebilirsiniz print g.
Skyler,

Ve başka bir baytla 'GET /%s HTTP/1.1\nHost:%s\n\n'.
Cees Timmerman

3

Python 2, 187 - 40 = 147 (bir REPL'de 141)

Zac'in cevabının sıkıştırılmış ve ilmekli versiyonu :

import socket,re
while 1:h,_,d=raw_input().partition('/');s=socket.create_connection((h,80));s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h));print re.findall('<p>(.*?)</p>',s.recv(9000))

Örnek:

dictionary.com
['The document has moved <a href="http://dictionary.reference.com/">here</a>.']
dictionary.reference.com
[]
paragraph.com
[]
rare.com
[]

Aslında işe yarar:

207 - 40 = 167

import socket,re
while 1:h,_,d=raw_input().partition('/');s=socket.create_connection((h,80));s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h));print'\n'.join(re.findall('<p>(.*?)</p>',s.recv(9000),re.DOTALL))

Örnek:

example.org
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
www.iana.org/domains/example
The document has moved <a href="/domains/reserved">here</a>.
www.iana.org/domains/reserved

dictionary.com
The document has moved <a href="http://dictionary.reference.com/">here</a>.
dictionary.reference.com

catb.org

      <a href="http://validator.w3.org/check/referer"><img
          src="http://www.w3.org/Icons/valid-xhtml10"
          alt="Valid XHTML 1.0!" height="31" width="88" /></a>

This is catb.org, named after (the) Cathedral and the Bazaar. Most
of it, under directory esr, is my personal site.  In theory other
people could shelter here as well, but this has yet to occur.
catb.org/jargon
The document has moved <a href="http://www.catb.org/jargon/">here</a>.
www.catb.org/jargon/
This page indexes all the WWW resources associated with the Jargon File
and its print version, <cite>The New Hacker's Dictionary</cite>. It's as
official as anything associated with the Jargon File gets.
On 23 October 2003, the Jargon File achieved the
dubious honor of being cited in the SCO-vs.-IBM lawsuit.  See the <a
href='html/F/FUD.html'>FUD</a> entry for details.
www.catb.org/jargon/html/F/FUD.html
 Defined by Gene Amdahl after he left IBM to found his own company:
   &#8220;<span class="quote">FUD is the fear, uncertainty, and doubt that IBM sales people
   instill in the minds of potential customers who might be considering
   [Amdahl] products.</span>&#8221; The idea, of course, was to persuade them to go
   with safe IBM gear rather than with competitors' equipment.  This implicit
   coercion was traditionally accomplished by promising that Good Things would
   happen to people who stuck with IBM, but Dark Shadows loomed over the
   future of competitors' equipment or software.  See
   <a href="../I/IBM.html"><i class="glossterm">IBM</i></a>.  After 1990 the term FUD was associated
   increasingly frequently with <a href="../M/Microsoft.html"><i class="glossterm">Microsoft</i></a>, and has
   become generalized to refer to any kind of disinformation used as a
   competitive weapon.
[In 2003, SCO sued IBM in an action which, among other things,
   alleged SCO's proprietary control of <a href="../L/Linux.html"><i class="glossterm">Linux</i></a>.  The SCO
   suit rapidly became infamous for the number and magnitude of falsehoods
   alleged in SCO's filings.  In October 2003, SCO's lawyers filed a <a href="http://www.groklaw.net/article.php?story=20031024191141102" target="_top">memorandum</a>
   in which they actually had the temerity to link to the web version of
   <span class="emphasis"><em>this entry</em></span> in furtherance of their claims. Whilst we
   appreciate the compliment of being treated as an authority, we can return
   it only by observing that SCO has become a nest of liars and thieves
   compared to which IBM at its historic worst looked positively
   angelic. Any judge or law clerk reading this should surf through to
   <a href="http://www.catb.org/~esr/sco.html" target="_top">my collected resources</a> on this
   topic for the appalling details.&#8212;ESR]

1

gawk, 235 - 40 = 195 bayt

{for(print"GET "substr($0,j)" HTTP/1.1\nHost:"h"\n"|&(x="/inet/tcp/0/"(h=substr($0,1,(j=index($0,"/"))-1))"/80");(x|&getline)>0;)w=w RS$0
for(;o=index(w,"<p>");w=substr(w,c))print substr(w=substr(w,o+3),1,c=index(w,"/p>")-2)
close(x)}

Golf oynadı, ancak bu http://başlangıçta web adresini gerektiren daha affedilmeyen bir versiyonudur . Ve kök dizine erişmek istiyorsanız, adresi a ile sonlandırmanız gerekir /. Ayrıca, <p>etiketlerin küçük harf olması gerekir.

Önceki sürümüm aslında </p><p>doğru içeren satırları işlemiyordu. Bu şimdi sabittir.

Giriş için çıkış example.com/

This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>

Hala Wikipedia ile çalışmıyor. Bunun sebebi, Vikipedi'nin httpsher şey için kullandığıdır . Ama bilmiyorum.

Aşağıdaki sürüm, giriş için biraz daha bağışlayıcıdır ve büyük harf etiketlerini de kullanabilir.

IGNORECASE=1{
    s=substr($0,(i=index($0,"//"))?i+2:0)
    x="/inet/tcp/0/"(h=(j=index(s,"/"))?substr(s,1,j-1):s)"/80"
    print"GET "substr(s,j)" HTTP/1.1\nHost:"h"\nConnection:close\n"|&x
    while((x|&getline)>0)w=w RS$0
    for(;o=index(w,"<p>");w=substr(w,c))
        print substr(w=substr(w,o+3),1,c=index(w,"/p>")-2)
    close(x)
}

Hattan emin değilim "Connection:close". Zorunlu görünmüyor. Kendisiyle veya onsuz farklı çalışacak bir örnek bulamadım.


1

Powershell (4) 240

$input=Read-Host ""
$url=[uri]$input
$dir=$url.LocalPath
Do{
$res=Invoke-WebRequest -URI($url.Host+"/"+$dir) -Method Get
$res.ParsedHtml.getElementsByTagName('p')|foreach-object{write-host $_.innerText}
$dir=Read-Host ""
}While($dir -NE "")

Ungolfed (vekil gerekli değildir)

$system_proxyUri=Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyServer
$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxyUri = $proxy.GetProxy($system_proxyUri.ProxyServer)
$input = Read-Host "Initial url"
#$input="http://stackoverflow.com/questions/tagged/powershell"
$url=[uri]$input
$dir=$url.LocalPath
Do{
$res=Invoke-WebRequest -URI($url.Host+"/"+$dir) -Method Get -Proxy($proxyUri)
$res.ParsedHtml.getElementsByTagName('p')|foreach-object{write-host $_.innerText}
$dir=Read-Host "next dir"
}While($dir -NE "")

düzenleme * ayrıca not etmek zor değil ezberlemek ^^


-1

Java 620 B

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class JavaApplication12 {

    public static void main(String[] args) {
        try {             
            BufferedReader i = new BufferedReader(new InputStreamReader(new URL(args[0]).openStream()));
            String l;
            boolean print = false;
            while ((l = i.readLine()) != null) {
                if (l.toLowerCase().contains("<p>")) {
                    print = true;
                }
                if (print) {
                    if (l.toLowerCase().contains("</p>")) {
                        print = false;
                    }
                    System.out.println(l);
                }
            }

        } catch (Exception e) {

        }
    }

}

2
Programlama Bulmacaları ve Kod Golf'üne Hoşgeldiniz! Maalesef bu gönderi geçersiz. Soru sadece düşük seviyeli TCP API'lerine izin verdiği için kullanamazsınız InputStreamReader.
Dennis,

1
Oh, çok özür dilerim ve gösterdiğiniz için teşekkür ederim. bir sonraki cevapta daha iyisini yapacak
Shalika Ashan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.