Browser Web Terkecil di Dunia

72

Backstory:

Anda menikmati pekerjaan pemrograman baru Anda di mega-multi-korporasi. Namun, Anda tidak diizinkan menjelajah web karena komputer Anda hanya memiliki CLI. Mereka juga menjalankan sweeping semua hard drive karyawan, sehingga Anda tidak bisa hanya mengunduh peramban web CLI yang besar. Anda memutuskan untuk membuat peramban teks sederhana yang sekecil mungkin agar Anda dapat menghafalnya dan mengetiknya menjadi file sementara setiap hari.

Tantangan:

Tugas Anda adalah membuat browser web golf dalam antarmuka baris perintah. Itu harus:

  • Ambil satu URL melalui via args atau stdin
  • Membagi directorydan hostkomponen URL
  • Kirim permintaan HTTP sederhana ke hostuntuk meminta katadirectory
  • Cetak isi setiap tag <p>paragraf</p>
  • Dan apakah keluar atau meminta halaman lain

Info lebih lanjut:

Permintaan HTTP sederhana terlihat seperti ini:

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

Mengakhiri baris baru ditekankan.

Respons khas terlihat seperti:

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

Aturan:

  • Ini hanya perlu bekerja pada port 80 (tidak diperlukan SSL)
  • Anda tidak boleh menggunakan netcat
  • Apapun bahasa pemrograman yang digunakan, hanya TCP API level rendah yang diizinkan (kecuali netcat)
  • Anda tidak boleh menggunakan GUI, ingat, ini adalah CLI
  • Anda tidak boleh menggunakan parser HTML, kecuali yang builtin (BeautifulSoup bukan builtin)
  • Bonus !! Jika program Anda kembali dan meminta URL lain alih-alih keluar, -40 karakter (selama Anda tidak menggunakan rekursi)
  • Tidak ada program pihak ketiga. Ingat, Anda tidak dapat menginstal apa pun.
  • , sehingga hitungan byte terpendek menang
Dokter
sumber
7
Python,import webbrowser;webbrowser.open(url)
Biru
8
@muddyfish membaca aturan
TheDoctor
4
Bisakah Anda memberikan contoh halaman web semacam ini untuk menguji ini? Sulit menemukan tempat yang menggunakan <p>: P
a spaghetto
52
Apakah kami diizinkan mem - parsing HTML menggunakan regex ? ;-)
Digital Trauma
3
Pembatasan antarmuka soket tingkat rendah tampaknya melarang API tingkat-TCP dari sebagian besar bahasa yang memiliki API tingkat-TCP.
Peter Taylor

Jawaban:

63

Bash Murni (tanpa utilitas), 200 byte - 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

Saya pikir ini terserah spec, meskipun tentu saja hati-hati untuk parsing HTML menggunakan regex Saya pikir satu-satunya hal yang lebih buruk daripada parsing HTML menggunakan regex parsing HTML menggunakan pencocokan pola shell.

Ini sekarang berkaitan dengan <p>...</p>span beberapa baris. Masing <p>...</p>- masing berada pada jalur output yang terpisah:

$ 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>
$ 
Trauma Digital
sumber
35
Anda harus mengingat ini besok.
Conor O'Brien
14
+ ∞ untuk "parsing HTML menggunakan pencocokan pola shell"
SztupY
76
-1 karena avatar Anda adalah pesan bawah sadar
TheDoctor
1
... Anda dapat membuat koneksi TCP dari Bash? Sekarang saya benar-benar ketakutan!
MathematicalOrchid
2
Catatan: /dev/tcpadalah ekstensi opsional dan mungkin tidak ada dalam bash Anda. Anda perlu mengkompilasi dengan --enable-net-redirectionsuntuk memilikinya.
Chris Down
21

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

Bersenang-senang menjelajahi web:

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])."
");

Membaca URL dari STDINsuka http://www.example.com/. Keluaran paragraf dipisahkan oleh baris " \n" baru.


Tidak disatukan

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";
}

Versi pertama hanya mendukung satu URL

$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";

masukkan deskripsi gambar di sini


Suntingan

  • Seperti yang ditunjukkan dalam komentar oleh Braintist , saya benar-benar lupa untuk memasukkan jalan. Itu sudah diperbaiki sekarang, terima kasih. Menambahkan 30 byte .
  • Disimpan 3 byte dengan mengatur ulang $c(menyimpan konten halaman) dengan $c=$i=parse_url(trim(fgets(STDIN)));alih - alih $c=''.
  • Menyimpan 12 byte dengan mengganti \ndengan baris baru (5 byte), satu- whileloop dengan for(2 byte), menempatkan hampir semuanya ke dalam ekspresi for(2 byte) dan dengan mengganti foreachdengan join(3 byte). Berkat Blackhole .
  • Disimpan 3 byte dengan mengganti fgetsdengan stream_get_contentsTerima kasih kepada bwoebi .
  • Disimpan 5 byte dengan menghapus inisialisasi ulang $ckarena tidak diperlukan lagi $c sama sekali.
  • Disimpan 1 byte dengan menghapus pengubah pola mdari Regex. Berkat kerja manat
masukkan nama pengguna di sini
sumber
1
@ Briantist Oh man, aku benar-benar merindukan itu. : D Terima kasih, sudah diperbaiki sekarang.
masukkan nama pengguna di sini
1
Saya tidak tahan kalau Perl mengalahkan PHP, jadi jangan lupa: whiledilarang saat bermain golf ( forseringkali lebih pendek tetapi tidak pernah lebih lama), dan untuk melakukan baris baru, cukup tekan enter (1 byte, bukan 2 untuk \n)! Ini kode Anda (yang belum diuji) sedikit lebih golf (227 byte), dengan baris baru digantikan oleh :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
Maksud saya bukan "terlarang" sebagai "melanggar aturan", maksud saya itu tidak berguna sama sekali, karena for-loop selalu lebih baik daripada while-loop;).
Blackhole
1
@MichaelDibbets Sebenarnya saya sudah melakukan itu seperti yang ditulis dalam edit. Hm Biarku lihat. Haha, saya lupa menyalin dan menghitung cuplikan terakhir. Duh : D Hal seperti itu terjadi, jika Anda memperbarui kode Anda sebelum sarapan. Terima kasih telah menunjukkannya.
masukkan nama pengguna di sini
14

Perl, 132 byte

155 byte kode + 17 untuk -ln -MIO::Socket- 40 untuk terus-menerus meminta URL

Seperti jawaban @ DigitalTrauma, regex parsing HTML, beri tahu saya jika itu tidak dapat diterima. Tidak menyimpan URL parsing lagi ... Saya akan melihatnya nanti ... Tutup untuk Bash! Terima kasih banyak kepada @ Schwern karena telah menyelamatkan saya byte (!) Dan @ skmrx karena telah memperbaiki bug untuk memungkinkan klaim bonus!

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

Pemakaian

$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>
Dom Hastings
sumber
Saya memperbaiki bug dan mempersingkat kodenya dengan menghapus kebutuhan untuk mendeklarasikan $ h dan $ p atau memiliki path default. Itu juga tidak lagi membutuhkan trailing / pada host.
Schwern
1
Kita yang harus dikalahkan sekarang. :)
Schwern
Saya pikir saya sudah selesai untuk malam ini. :)
Schwern
Karena skrip meminta URL lain alih-alih keluar, Anda dapat mengklaim tambahan -40 byte
svsd
1
@DigitalTrauma Anda memang benar! Saya telah mengklaim bonus berkat skmrx memperbaiki bug saya dengan '$ /' dan saya tidak akan berada di dekat Anda jika bukan karena Schwern!
Dom Hastings
13

PowerShell, 315 294 268 262 254 byte

355 334 308 302 294 - 40 untuk konfirmasi

$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
}

Membutuhkan PowerShell v5

Semua ujung garis (termasuk yang tertanam dalam string) hanya baris baru \n(terima kasih Blackhole ) yang didukung penuh oleh PowerShell (tetapi jika Anda menguji, berhati-hatilah; penggunaan ISE \r\n).

briantis
sumber
4
+1 untuk menjadikan tugas admin server saya tampak jauh lebih produktif
daripada
HTTP membutuhkan CRLF, bukan LF! [ HTTPSYNTAX ]
Sikat Gigi
2
@toothbrush Ha! Poin yang diambil, tetapi ketentuan toleransi tampaknya dalam efek penuh. Jelas tugas ini adalah tentang apa yang berfungsi dan bukan apa yang benar (jika tidak kita tidak akan mem-parsing HTML dengan regex dan menggunakan pustaka TCP tingkat rendah alih-alih pustaka yang sudah teruji dengan baik).
briantist
1
@briantist greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.5 mengatakan bahwa "penerima MUNGKIN mengenali LF tunggal sebagai terminator garis dan mengabaikan CR apa pun sebelumnya". Saya membaca bahwa sebagai makna sebagian besar server web akan mengimplementasikannya, dan pertanyaannya pasti tidak mengatakan itu harus menghasilkan permintaan yang benar GET ... :)
Toothbrush
8

Skrip Groovy, 89 , 61 byte

Loop kembali untuk bonus 101- 40 = 61

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

Dengan hanya args, 89 byte

this.args[0].toURL().text.findAll(/<p>(?s)(.*?)<\/p>/).each{println it[3..it.length()-5]}
Rnet
sumber
1
Groovy mengalahkan semua orang. Seperti seharusnya.
spaghetto
1
@ quartata Jika tetap seperti itu, itu akan menjadi yang pertama kalinya , jadi ...;)
Geobits
11
"hanya API TCP level rendah yang diizinkan"
Digital Trauma
Ya saya akan setuju dengan @DigitalTrauma bahwa ini tidak menggunakan TCP API tingkat rendah. Aturan menyatakan bahwa Anda harus membagi host dan path Anda sendiri.
TheDoctor
6

Bash (mungkin curang tetapi tampaknya dalam aturan) 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

Berkat Digital Trauma.

Karena saya tidak perlu memisahkan URL, ini juga berfungsi: 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
philcolbourn
sumber
8
Saya berpendapat bahwa menggunakan konverter html2txt online ini adalah celah standar
Digital Trauma
1
Iya. Dan saya juga menggunakan kucing sehingga solusi Anda aman.
philcolbourn
5

C 512 Bytes

#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);}}} 

Berdasarkan longgar pada entri saya di sini , Dibutuhkan alamat web tanpa "https: //" terkemuka. Itu tidak akan menangani <p>pasangan bersarang dengan benar :(

Diuji secara ekstensif pada www.w3.org/People/Berners-Lee/
Ini berfungsi ketika dikompilasi dengan Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Ini memiliki perilaku yang tidak terdefinisi cukup sehingga mungkin tidak berfungsi di tempat lain.

ASHelly
sumber
Saya akan turun kira-kira jalur yang sama (ini segfaults ketika dikompilasi dengan gcc), tetapi harus mungkin untuk mendapatkan di bawah 400 byte di C. Tidak yakin tentang dentang, tetapi Anda tidak harus mendeklarasikan jenis kembalinya main. Anda juga dapat menghapus include dan "mengakses" struct sebagai array integer. Saya juga mendapatkan tanggapan dengan "DAPATKAN /% s HTTP / 1.1 \ r \ n \ r \ n \", tetapi jarak tempuh yang mungkin berbeda-beda berdasarkan situs ...
Comintern
5

Ruby, 118

147 sumber byte; 11 byte ' -lprsocket'; -40 byte untuk perulangan.

*_,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

Contoh penggunaan:

$ 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>.
ezrast
sumber
4

AutoIt , 347 byte

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

Pengujian

Memasukkan:

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

Keluaran:

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

Memasukkan:

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

Keluaran:

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

Catatan

  • Tidak mendukung <p>tag bersarang
  • Hanya mendukung <p>tag (tidak peka huruf besar-kecil), akan memecah setiap format tag lainnya
  • Panics Loops tanpa batas waktu ketika terjadi kesalahan
mınxomaτ
sumber
4

C #, 727 Bytes - 40 = 687 Bytes

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;}}

Ini sedikit pelatihan tapi pasti berkesan :)

Berikut ini adalah versi yang tidak dikoleksi:

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;
        }
    }
}

Seperti yang Anda lihat, ada masalah kebocoran memori sebagai bonus :)

Stephan Schinkel
sumber
Di mana kebocoran ingatannya? Saya tidak melihat usingpernyataan di sekitar aliran tetapi itu tidak membuat kebocoran.
Gusdor
Anda dapat memangkas beberapa byte lagi: input = input.trimStart ("http: //") akan mengganti klausa "jika", dan Anda harus dapat menggunakan System.Text.Encoding.ASCII.GetBytes () secara langsung tanpa harus untuk menyimpannya di asciiEncoding terlebih dahulu. Saya pikir Anda bahkan akan maju dengan "Menggunakan Sistem;" line dan menyingkirkan beberapa "Sistem."
minnmass
3

JavaScript (NodeJS) - 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))));

Pemakaian:

node file.js www.example.com

Atau diformat

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)))
});
Benjamin Gruenbaum
sumber
1
Peringatan: ini akan berfungsi untuk halaman kecil - halaman yang lebih besar memancarkan banyak peristiwa data.
Benjamin Gruenbaum
3

Python 2 - 212 209 byte

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
Zac Crites
sumber
Anda dapat menyimpan dua byte dengan menghapus spasi setelah tanda titik dua pada while h:dan sebelumnya print g.
Skyler
Dan byte lain dengan 'GET /%s HTTP/1.1\nHost:%s\n\n'.
Cees Timmerman
3

Python 2, 187 - 40 = 147 (141 dalam REPL)

Versi Zac yang dikompresi dan dilingkari :

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))

Contoh:

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

Sebenarnya bermanfaat adalah ini:

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))

Contoh:

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]
Cees Timmerman
sumber
1

gawk, 235 - 40 = 195 byte

{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)}

Menurunkannya, tetapi ini adalah versi yang lebih tak kenal ampun, yang membutuhkan alamat web tanpa http://di awal. Dan jika Anda ingin mengakses direktori root, Anda harus mengakhiri alamat dengan a /. Selanjutnya <p>tag harus huruf kecil.

Versi saya sebelumnya sebenarnya tidak menangani garis yang berisi </p><p>dengan benar. Ini sekarang sudah diperbaiki.

Output untuk input 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>

Masih tidak berfungsi dengan Wikipedia. Saya pikir alasannya adalah Wikipedia menggunakan httpssemuanya. Tapi saya tidak tahu.

Versi berikut sedikit lebih memaafkan dengan input dan dapat menangani tag huruf besar juga.

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)
}

Saya tidak yakin tentang "Connection:close"garis itu. Sepertinya tidak wajib. Saya tidak dapat menemukan contoh yang akan bekerja berbeda dengan atau tanpa itu.

Cabbie407
sumber
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 "")

Tidak digabungkan (proxy tidak diperlukan)

$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 "")

sunting * juga tidak sulit untuk menghafal ^^

dwana
sumber
-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) {

        }
    }

}
Shalika Ashan
sumber
2
Selamat Datang di Programming Puzzles & Code Golf! Sayangnya, pengiriman ini tidak valid. Pertanyaannya hanya memungkinkan TCP API level rendah, jadi Anda tidak bisa menggunakannya InputStreamReader.
Dennis
1
Oh saya sangat menyesal dan terima kasih telah menunjukkannya. akan melakukan yang lebih baik dalam jawaban berikutnya
Shalika Ashan