3

URL の他の情報を含む複数の URL を持つテキスト ファイルがあります。txt ファイルを読み取り、URL のみを配列に保存してダウンロードするにはどうすればよいですか? 使いたい

C = textscan(fileId, formatspec);

formatspec形式としての URLには何を記載すればよいですか?

4

2 に答える 2

4

これは の仕事ではありませんtextscanこれには正規表現を使用する必要があります。MATLAB では、正規表現はここで説明されています。URL については、ここまたは他の言語の例も参照してください。

MATLAB での例を次に示します。

% This string is obtained through textscan or something
str = {...
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here'
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://';
};


% find URLs    
C = regexpi(str, ...
    ['((http|https|ftp|file)://|www\.|ftp\.)',...
    '[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]'], 'match');

C{:}

結果:

ans = 
    'http://www.example.com/index.php?query=test&otherStuf=info'
ans = 
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py'

この正規表現には、プロトコルを含めるか、先頭に or を付ける必要があることに注意www.くださいftp.。のようなものexample.com/universal_remote.cgi?redirect=は一致しません。

続けて、正規表現がより多くのケースをカバーするようにすることができます。ただし、最終的には最も重要な結論に出くわすことになります (たとえば、ここで行ったように; どこから正規表現を取得したか): 有効な URL を正確に構成するものの完全な定義が与えられた場合、すべての URL に常に一致できる単一の正規表現はありません。有効な URL。つまり、示されている正規表現のいずれによってもキャプチャされない有効な URL を思いつくことができます。

ただし、この最後のステートメントは実用的というよりは理論的なものであることに注意してください。これらの一致しない URL は有効ですが、実際にはあまり遭遇しません :) 言い換えれば、URL がかなり標準的な形式である場合、私があなたに与えた正規表現でカバーされています。

ここで、pm89 による Java の提案に少しふざけました。私が疑ったように、コードに別の「グーのレイヤー」を導入するため、単なる正規表現よりも1桁遅くなります(私のタイミングでは、インポートを除いて、違いは約40倍遅くなりました)。これが私のバージョンです:

import java.net.URL;
import java.net.MalformedURLException;

str = {...
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here'
    'pre--URL garbage example.com/index.php?query=test&otherStuf=info more stuff here'
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://';
};


% Attempt to convert each item into an URL.  
for ii = 1:numel(str)    
    cc = textscan(str{ii}, '%s');
    for jj = 1:numel(cc{1})
        try
            url = java.net.URL(cc{1}{jj})

        catch ME
            % rethrow any non-url related errors
            if isempty(regexpi(ME.message, 'MalformedURLException'))
                throw(ME);
            end

        end
    end
end

結果:

url =
    'http://www.example.com/index.php?query=test&otherStuf=info'
url =
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py'

私は にあまり詳しくありませんjava.net.URLが、プロトコルや標準ドメイン (例: ) が先頭にない URL を見つけることもできないようですexample.com/path/to/page

このスニペットは間違いなく改善される可能性がありますが、この長く、本質的に遅く、はるかに醜いソリューションのためにこれを行う理由を検討することをお勧めします:)

于 2013-07-01T06:19:29.573 に答える
3

私が思ったように、この回答java.net.URLに従って使用できます。

Matlabで同じコードを実装するには:

filereadまず、次の例を使用して、ファイルを文字列に読み取ります。

str = fileread('Sample.txt');

次に、次を使用して、スペースに関してテキストを分割しますstrsplit

spl_str = strsplit(str);

最後java.net.URLに、URL を検出するために使用します。

for k = 1:length(spl_str)
    try
       url = java.net.URL(spl_str{k})
       % Store or save the URL contents here
    catch e
       % it's not a URL.
    end
end

を使用して、URL の内容をファイルに書き込むことができますurlwrite。ただし、最初に から取得した URL を に変換しjava.net.URLますchar

url = java.net.URL(spl_str{k});
urlwrite(char(url), 'test.html');

それが役に立てば幸い。

于 2013-07-01T06:22:45.440 に答える