URL의 다른 정보가 포함 된 여러 개의 URL이있는 텍스트 파일이 있습니다. txt 파일을 읽고 URL을 배열로 저장하면 어떻게 다운로드 할 수 있습니까? 내가 사용하려는MATLAB의 txt 파일에서 URL 만 읽는 방법
C = textscan(fileId, formatspec);
나는 형식으로 URL에 대한
formatspec
에서 언급해야한다 무엇
?
URL의 다른 정보가 포함 된 여러 개의 URL이있는 텍스트 파일이 있습니다. txt 파일을 읽고 URL을 배열로 저장하면 어떻게 다운로드 할 수 있습니까? 내가 사용하려는MATLAB의 txt 파일에서 URL 만 읽는 방법
C = textscan(fileId, formatspec);
나는 형식으로 URL에 대한
formatspec
에서 언급해야한다 무엇
?
이것은 textscan
의 직업이 아닙니다. 이 경우 regular expressions을 사용해야합니다. MATLAB에서 정규식은 here으로 설명됩니다. URL의 경우 다른 언어로는 here 또는 here을 참조하십시오.
여기 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{:}
결과 :이 정규식은 프로토콜이 또는는 선도적 인 www.
또는 ftp.
이 포함이 당신을 필요로
ans =
'http://www.example.com/index.php?query=test&otherStuf=info'
ans =
'ftp://localhost/home/ruler_of_the_world/awesomeContent.py'
참고. example.com/universal_remote.cgi?redirect=
과 같은 값은 이 아니며과 일치합니다.
당신은 계속해서 정규 표현식 커버를 더 많이 만들 수 있습니다. 그러나 결국 가장 중요한 결론에 비틀 거릴 것입니다 (예 : here 예를 들어, 내가 어디에서 내 정규식을 가지고 만든) : 전체 정확한 URL을 정확하게 정의의 정의 주어진 단일 정규식 수 없습니다. 항상에 일치 마다 유효한 URL로 일치합니다. 즉, 표시 할 수있는 임의의 URL에 의해 캡쳐 된 이 아닌 유효한 URL이 있습니다.이 표시됩니다.
그러나이 최종 성명서는 실용적 이라기보다는 이론적 인 것입니다. 일치하지 않는 URL은 유효하지만 자주 발생하지는 않습니다. 즉, URL에 꽤 표준 형식이 있다면 내가 당신에게 준 정규식으로 꽤 많이 덮여있다.
지금, 나는 pm89에 의한 Java 제안으로 약간 주위를 속였습니다. 내가 생각하기에, 코드에 다른 "끈적 거리는 층"을 소개하기 때문에 정규 표현식보다 더 느린 순서입니다 (내 타이밍에서는 차이가 가져 오기를 제외하고 약 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
) .
이 조각은 의심 할 여지없이 따라 개선 될 수 있지만 더 이상이이 작업을 수행 할 것 왜 당신이 java.net.URL
을 사용할 수 의심으로 내가하고, 본질적으로 느린 고려하는 것이 훨씬 더 추악한 솔루션 :
+1 : 좋은 학습과 좋은 해결책. 그러나 단 하나의 방법은 서버에 대한 연결이 필요하고 연결을 확인하기 위해 표준 스키마 (예 : example.com/path/to/page)가없는 빠른 방법이있을 것이라고 생각하지 않습니다. 대답] (http://stackoverflow.com/a/1600333/1698972) 제안. – pm89
당신을 촉구 this answer에 따라.그런 공간에 대한 텍스트를 분할
str = fileread('Sample.txt');
,
strsplit
를 사용 : 예를 들어
fileread
를 사용하여,
먼저 문자열로 파일을 읽어
는 matlab에에 동일한 코드를 구현하려면 :spl_str = strsplit(str);
마지막으로 UR을 감지 java.net.URL
를 사용 LS :
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
당신은 urlwrite
을 사용하여 파일에 URL 내용을 쓸 수 있습니다. 하지만 먼저 char
에 java.net.URL
에서 얻은 URL을 변환 :
url = java.net.URL(spl_str{k});
urlwrite(char(url), 'test.html');
는 도움이되기를 바랍니다.
저는 자바에 익숙하지 않지만 Matlab에서 java를 사용하여 할 수 있다고 생각합니다. [* 문자열의 URL 존재 여부를 감지하는 방법] (http://stackoverflow.com/questions/)을 읽어보십시오. 285619/url-in-a-string) 및 [* Calling Java from MATLAB *] (http://blogs.mathworks.com/community/2009/07/06/)을 참조하십시오. calling-java-from-matlab /). – pm89