世界最小のWebブラウザ


72

バックストーリー:

メガマルチコーポレーションで新しいプログラミングの仕事を楽しんでいます。ただし、コンピューターにはCLIしかないため、Webを閲覧することはできません。また、全従業員のハードドライブのスイープも実行するため、大きなCLI Webブラウザーを単純にダウンロードすることはできません。できる限り小さく、毎日一時ファイルに入力できるように、できるだけ小さいシンプルなテキストブラウザーを作成することにしました。

チャレンジ:

あなたの仕事は、コマンドラインインターフェイス内でゴルフWebブラウザーを作成することです。そうすべき:

  • argsまたはstdin経由で単一のURLを取得します
  • URLのコンポーネントdirectoryhostコンポーネントを分割します
  • 単純なHTTPリクエストを送るhostと要求しますdirectory
  • <p>段落</p>タグの内容を印刷します
  • 終了するか、別のページを要求します

詳細:

単純なHTTPリクエストは次のようになります。

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

改行の強調。

典型的な応答は次のようになります。

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

ルール:

  • ポート80でのみ動作する必要があります(SSLは不要です)
  • netcatは使用できません
  • どのプログラミング言語が使用されていても、低レベルのTCP APIのみが許可されます(netcatを除く)
  • GUIを使用することはできません。CLIであることに注意してください
  • 組み込みのものを除き、HTMLパーサーは使用できません(BeautifulSoupは組み込みではありません)
  • ボーナス!!プログラムがループバックし、終了する代わりに別のURLを要求する場合、-40文字(再帰を使用しない限り)
  • サードパーティのプログラムはありません。何もインストールできないことを忘れないでください。
  • なので、最短バイト数が勝ちます

7
Python、import webbrowser;webbrowser.open(url)
ブルー

8
@muddyfishはルールを読む
-TheDoctor

4
これをテストするためのある種のサンプルWebページを提供できますか?<P>使用場所を見つけることは困難である:P
spaghetto

52
私たちはすることが許可されている正規表現を使用してHTMLを解析しますか?;-)
デジタル外傷

3
低レベルのソケットインターフェイスへの制限は、TCPレベルのAPIを持つほとんどの言語のTCPレベルのAPIを禁止しているようです。
ピーターテイラー

回答:


63

Pure Bash(ユーティリティなし)、200バイト-40ボーナス= 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

これは仕様次第であると思いますが、もちろん正規表現使用したHTMLの解析には注意してください。

これにより<p>...</p>、複数行にわたる処理が可能になりました。それぞれ<p>...</p>が出力の個別の行にあります。

$ 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
これを明日までに覚えておく必要があります。
コナーオブライエン

14
「シェルパターンマッチングを使用したHTMLの解析」の+∞–
SztupY

76
-1アバターがサブリミナルメッセージングであるため
TheDoctor

1
... BashからTCP接続を確立できますか?今、私は本当におびえています!
MathematicalOrchid

2
注:/dev/tcpオプションの拡張機能であり、bashのビルドには存在しない場合があります。コンパイルする必要があります--enable-net-redirections
クリスダウン

21

PHP、175バイト(215から40ボーナス)227 229 239 202 216 186バイト

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

STDINなどからURLを読み取りますhttp://www.example.com/。改行 " \n"で区切られた段落を出力します。


非ゴルフ

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

1つの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";

ここに画像の説明を入力してください


編集

  • Braintistのコメントで指摘されているように、私はパスを含めることを完全に忘れていました。これは修正されました、ありがとう。30バイトを追加しました
  • 代わりにでリセット(ページコンテンツを保持)して3バイトを保存しました$c$c=$i=parse_url(trim(fgets(STDIN)));$c=''
  • 保存された 12のバイトを交換することによって\n新しい行(5バイト)、一つにwhile-ループとfor、(2バイト)の式にほぼすべてを確定するfor(2バイト)と置き換えることによってforeachjoin(3バイト)。Blackholeに感謝します。
  • 保存された 3つのバイトを置き換えることによって、fgetsstream_get_contentsのおかげbwoebi
  • 保存された 5つのバイトを除去することでの再初期化$c、それはもはや必要ないよう $c、すべてのを。
  • Regexからパターン修飾子を削除して1バイトを保存mしました。マナトワークのおかげで


1
@briantistああ、私はそれを見逃した。:Dありがとう、それは今修正されました。
insertusernamehere

1
PerlがPHPに勝つことは我慢できないので、忘れないでください:whileゴルフforをすることは禁じられています(多くの場合、短くなりますが長くはなりません\n)。ここで改行して(227バイト)よりgolfedビットは、置き換えられ、あなたの(未テスト)コードである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);
ブラックホール

1
「禁止」を「ルールに反して」という意味ではなく、単にfor-loopはa -loopよりも優れているため、まったく役に立ちませんwhile;)。
ブラックホール

1
@MichaelDibbets実際、私はすでに編集で書かれているようにそれをしました。ふむ そうねぇ。ハハ、最後のスニペットをコピーして数えるのを忘れました。Duh:D朝食前にコードを更新すると、そのようなことが起こります。それを指摘してくれてありがとう。
insertusernamehere

14

Perl、132バイト

155バイトのコード+ -ln -MIO::Socket-の場合は17- 継続的にURLを要求する場合は40

@DigitalTraumaの答えである正規表現HTMLの解析と同様に、それが受け入れられない場合はお知らせください。これ以上URLの解析を続けません...後で見ます... Bashに近い!59(!)バイトを節約してくれた@ Schwernと、ボーナスを請求できるようにバグを修正してくれた@ skmrxに大いに感謝します!

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

使用法

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

バグを修正し、$ hと$ pを宣言する必要性をなくすか、デフォルトのパスを使用することでコードを短縮しました。また、ホストの末尾の/は不要になりました。
シュヴェルン

1
私たちは今、勝つためのものです。:)
シュヴェルン

私は夜のために終わったと思う。:)
シュヴェルン

スクリプトは終了する代わりに別のURLを要求するため、追加の-40バイト
-svsd

1
@DigitalTraumaあなたは確かに正しいです!'$ /'でバグを修正したskmrxのおかげでボーナスを請求しましたが、Schwernがなければあなたのそばにはいられません!
ドムヘイスティングス

13

PowerShell、315294268262254バイト

355 334 308 302 294-40プロンプト

$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が必要

すべての行末(文字列に埋め込まれたものを含む)は、PowerShellで完全にサポートされている改行のみ\nBlackholeに感謝)です(ただし、テストする場合は注意してください。ISEではを使用します\r\n)。


4
私のサーバーの管理業務を行うための+1は、はるかに生産見える
thanby

HTTPにはLFではなくCRLFが必要です![ HTTPSYNTAX ]
歯ブラシ

2
@歯ブラシハ!ポイントをとったが、公差の規定は完全に効果があるようだ。明らかに、このタスクは機能するものであり、正しいものではありません(そうでなければ、HTMLを正規表現で解析し、十分にテストされた既存のライブラリの代わりに低レベルのTCPライブラリを使用しません)。
ブリアンティスト

1
@briantist greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.5は、「受信者は単一のLFをラインターミネータとして認識し、先行するCRを無視してもよい」と述べています。私は、ほとんどのWebサーバーがそれを実装することを意味すると読んでおり、質問は間違いなく正しい GET要求を生成する必要があるとは言っていません… :)
歯ブラシ

8

Groovyスクリプト、89、61バイト

ボーナス101- 40 = 61の ループバック

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

引数だけで、89バイト

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

1
Groovyは誰よりもゴルフを上回りました。あるべきです。
spaghetto

1
@quartataそれがそのようにとどまるなら、それは初めてでしょう、そう...;)
Geobits

11
「低レベルのTCP APIのみが許可されています」
デジタル外傷

ええ、これは低レベルのTCP APIを使用していないという@DigitalTraumaに同意するつもりです。ルールには、ホストとパスを自分で分割する必要があることが記載されています。
-TheDoctor

6

バッシュ(不正行為の可能性がありますが、ルール内にあるようです)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

Digital Traumaに感謝します。

URLを分割する必要がないため、これも機能します: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
私はこのオンラインhtml2txtコンバータを使用することがあることを主張するだろう標準抜け穴
デジタルトラウマ

1
はい。また、私は猫を使用しているため、ソリューションは安全です。
フィルコルボーン

5

C 512バイト

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

ここでの私のエントリに大まかに基づいて、先頭の「https://」なしでWebアドレスを取得します。ネストされた<p>ペアを正しく処理しません:(

広範囲にテストされ、www.w3.org/People/Berners-Lee/
ItでコンパイルされたときにApple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
動作します。十分に未定義の動作があるため、他の場所では動作しません。


私はほぼ同じトラックに行きました(gccでコンパイルするとこのセグメンテーション違反が発生します)が、Cで400バイト未満になる可能性があります。clangについてはわかりませんが、mainの戻り値の型を宣言する必要はありません。代わりに、インクルードを削除し、構造体を整数配列として「アクセス」することもできます。また、「GET /%s HTTP / 1.1 \ r \ n \ r \ n \」で応答を受け取っていますが、その距離はサイトによって異なる場合があります
Comintern

5

ルビー、118

147バイトのソース。11バイト ' -lprsocket'; ループ用に-40バイト。

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

使用例:

$ 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バイト

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

テスト中

入力:

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

出力:

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

入力:

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

出力:

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

備考

  • ネストされた<p>タグをサポートしていません
  • <p>タグのみをサポートし(大文字と小文字を区別しない)、他のすべてのタグ形式で中断します
  • エラーが発生するとパニックが無限にループする

4

C#、727バイト-40 = 687バイト

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

それは少し訓練ですが、確かに忘れられないです:)

以下は、バージョン化されていないバージョンです。

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

ご覧のとおり、ボーナスとしてメモリリークの問題があります:)


メモリリークはどこにありますか?usingストリームの周りにステートメントは表示されませんが、リークは発生しません。
ガスドール

さらに数バイトをトリムできます。input= input.trimStart( "http://")は "if"句を置き換えます。System.Text.Encoding.ASCII.GetBytes()を直接使用する必要があります。最初にasciiEncodingに保存します。「システムを使用する」ことであなたも出てくると思います。線と一握りの「システム」を取り除きます。
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))));

使用法:

node file.js www.example.com

またはフォーマット済み

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
警告:これは小さなページで機能します-大きなページは複数のデータイベントを発行します。
ベンジャミングリュンバウム

3

パイソン2 - 212の 209バイト

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

コロンのwhile h:前後の空白を削除することにより、2バイトを節約できますprint g
スカイラー

そして、もう1バイト'GET /%s HTTP/1.1\nHost:%s\n\n'
シーズティマーマン

3

Python 2、187-40 = 147(REPLでは141)

Zacの答えの圧縮およびループバージョン:

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

例:

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

実際にこれは便利です:

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

例:

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バイト

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

それを打ち倒しましたが、これはより容赦のないバージョンでありhttp://、最初にウェブアドレスが必要です。ルートディレクトリにアクセスする場合は、アドレスを/。で終了する必要があります。さらに、<p>タグは小文字でなければなりません。

私の以前のバージョンは、実際に</p><p>正しく含む行を処理しませんでした。これは修正されました。

入力用の出力 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>

ウィキペディアではまだ機能しません。理由は、ウィキペディアがhttpsすべてに使用しているからだと思います。しかし、私は知りません。

次のバージョンは、入力に対してもう少し寛容であり、大文字のタグも処理できます。

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

"Connection:close"行についてはわかりません。必須ではないようです。私はそれの有無にかかわらず異なる動作をする例を見つけることができませんでした。


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(プロキシは必要ありません)

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

編集*覚えるのも難しくありません^^


-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
プログラミングパズルとコードゴルフへようこそ!残念ながら、この提出は無効です。この質問では、低レベルのTCP APIのみが許可されているため、を使用できませんInputStreamReader
デニス

1
ああすみません、それを指してくれてありがとう。次の答えで良くなります
シャリカアシャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.