웹페이지의 섹션 추출친애하는 지역사회 회원 여러분,
길고 지저분한 문자열에서 텍스트 섹션을 추출하려고 합니다. YouTube 동영상의 설명 부분을 추출하고 싶습니다.
예를 들어, 이 비디오에서는: https://youtu.be/yvoddqG-lm8 설명 부분만 추출하고 싶습니다.
“Mia Stephens가 JMP에서 기본적인 통계 분석을 수행하는 방법을 보여줍니다. 그녀는 분포를 사용하여 한 번에 하나의 변수씩 데이터를 분석하는 방법을 다룹니다. 두 개의 변수를 포함하는 분석에는 Fit Y by X를 사용하고, 두 개 이상의 변수를 포함하는 분석에는 Fit Model을 사용합니다. 그녀는 또한 데이터를 요약하고 그래프로 표시하는 도구도 검토합니다. 3부 동영상인 이 동영상은 JMP 30일 무료 평가판이나 새로운 JMP 라이센스를 최대한 활용하기 위해 JMP 사용의 기본 사항을 학습하는 시리즈입니다. JMP 학술 홍보대사인 Mia Stephens는 JMP 메뉴와 데이터 표를 탐색하고, 데이터를 JMP로 가져오고, 데이터를 요약 및 그래프화하고, 기본 통계 분석을 수행하는 방법을 보여줍니다. 이 데모에서는 9월에 출시될 JMP 11을 사용합니다. JMP 11에 어떤 기능이 추가되는지 확인하세요. http://www.jmp.com/software/preview-j...”
다음 명령을 사용하여 전체 웹 페이지 스크립트를 문자열로 가져옵니다.
page = open (https://youtu.be/yvoddqG-lm8);
내가 보고 있는 설명 부분이 페이지에 여러 번 나타나는 것을 확인했습니다. 특히 다음 용어 뒤에는 다음이 포함됩니다.
\\!"설명\\!":{\\!"실행\\!":[{\\!"텍스트\\!":\\!"
또는: \\!"설명\\!":{\\!"simpleText\\!":\\!"
어떤 제안?
전체 페이지 코드를 추출하는 올바른 방향인가요? 아니면 찾고 있는 섹션만 직접 추출할 수 있는 방법이 있나요?
감사합니다.
Re: 웹페이지에서 누락된 부분을 추출하는 중입니다.@LNitz - 유튜브 API 도움이 될 수도 있습니다. 다운로드 중인 YouTube HTML이 작년 정도에 변경된 것으로 나타나기 때문에 이 페이지의 정보가 표시된 대로 정확히 작동하지 않을 수 있습니다.
JMP 데이터 테이블을 만들고, 필요한 열을 추가하고, for-loop나 열 공식을 사용하여 테이블의 행을 채우고 싶다고 생각합니다.
Re: 웹페이지의 일부를 추출하는 중입니다.나는 이 깔끔한 절차를 시도했고 오류 없이 실행했습니다.하지만 복구한 텍스트가 JMP 파일에 게시되도록 삽입하는 방법을 모르겠습니다.이 파일을 실행하거나 다른 웹 페이지를 가리키는 약간 다른 버전을 실행하면 내가 정의한 파일(페이지라고 함)이 웹 페이지에서 데이터를 수신하지 않습니다.
내 코드는 다음과 같습니다(원본 소스 파일을 주석으로 포함).
/*page = open ("https://youtu.be/yvoddqG-lm8");;*/
page = Open( "https://www.theatlantic.com/ideas/archive/2021/07/republicans-anti-history-marjorie-taylor-greene/619403" );
division = Regex( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
Re: 웹페이지의 일부를 추출하는 중입니다.도구 상자에 새 도구를 추가하는 것이 마음에 들지 않는다면(그리고 정규 표현식으로 HTML을 구문 분석하는 복잡성을 피하고 싶다면) JMP의 Python Bridge를 활용할 수 있습니다(여기서는 Anaconda의 배포판과 함께 사용하는 도우미 ) HTML 구문 분석을 처리하기 위해 구축된 패키지를 사용합니다. BeautifulSoup.
이 패키지에는 수많은 선적 서류 비치 그리고 예 JMP와 Python 간에 데이터를 전송하는 방법을 알아낸 후에는(자세한 내용은 여기 ) 추출하려는 내용과 이를 JMP에서 어떻게 처리할지에 집중할 수 있습니다.
Re: 웹페이지의 일부를 추출하는 중입니다.엄청난!
함께 읽으시는 분들을 위해: 맨 위로 올라가세요. @마크_베일리 소개했다 주저하는 ? 운영자:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
그대로 재활용했어요 .*? 하지만 그것은 같은 생각이고 꽤 중요합니다. 그만큼 ? 수행원 + 또는 * 만든다 + 또는 * 주저하는 대신에 탐욕스러운 . +는 의미한다 하나 이상 그리고 * 수단 0 이상 왼쪽에 있는 것은 무엇이든... 이 경우에는 마침표입니다. 기간은 무엇이든 일치합니다. 탐욕스러운 을 의미한다 * 또는 + 반복할 것이다 . (모든 문자와 일치) 문자열 끝까지(~50,000자) 위의 예에서 정규식은 여전히 다음을 찾아야 합니다. "> . 텍스트 끝 부분에서는 일치할 수 없으므로 정규 표현식은 탐욕스럽게 획득한 문자를 한 번에 하나씩 공개하기 시작합니다. "> .아마 찾을 확률이 높을 겁니다 "> 이는 문자열 끝 부분 근처에 인용된 다른 문자열에 속하며 원하는 텍스트와 추가 텍스트 묶음을 허용하게 됩니다.
에서 주저하는 버전, .*? 처음에는 0개의 문자와 일치하지만 다음을 찾지 못합니다. "> . 그래서 정규식은 .*? 한 문자를 전달하고 다시 테스트합니다. 주저하는 바로 다음을 찾을 것이다 "> , 텍스트 끝 근처에는 하나도 없습니다.
욕심 많은 행동과 꺼리는 행동이 같은 답을 얻는 경우가 많으며, 욕심 많은 행동이 더 빠릅니다. 그러나 이 예에서는 답변이 다르며 마지못해가 더 빠릅니다(왜냐하면 마지못해 수십 자를 앞으로 나아가는 반면 탐욕스러운 경우는 수천 자를 앞으로 이동한 다음 대부분을 백업해야 할 수 있기 때문입니다).
Re: 웹페이지의 일부를 추출하는 중입니다.감사합니다 @Craige_Hales
이것은 번개처럼 친다! 내가 원했던 것을 정확하게 추출하고 다양한 YouTube 페이지에서 강력하게 작동합니다.
이게 내 최종 버전이야
New Table( "Video list",
Add Rows( 3 ),
New Script(
"bring description from YouTube",
For( i = 1, i <= N Rows(), i++,
page = Open( :link[i] );
division = Regex(
page,
"<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
:webpagetext[i] = withouttags;
)
),
New Column( "Video",
Character,
"Nominal",
Set Values(
{"Getting Started With JMP, Part 1", "Getting Started With JMP, Part 2",
"Getting Started With JMP, Part 3"}
)
),
New Column( "Link",
Character( 83 ),
"Nominal",
Set Values(
{
"https://www.youtube.com/watch?v=xge-f1KV_oc&list=PL411D719858B57C47&index=2&t=5s",
"https://www.youtube.com/watch?v=xhZVuDrKiEA&list=PL411D719858B57C47&index=3&t=0s",
"https://www.youtube.com/watch?v=1M8LzJ8bjwg&list=PL411D719858B57C47&index=4&t=0s"
}
)
),
New Column( "webpagetext", Character, "Nominal", Set Values( {"", "", ""} ) )
)Re: 웹페이지의 일부를 추출하는 중입니다.javascript json 스니펫에서 텍스트를 가져오려고 합니다. HTML에서 더 아래로 가져오는 것이 더 쉬울 것이라고 생각합니다. 나는 . \ 이스케이프를 피하기 위해 따옴표 대신. 이
...
는 이 안에 중첩된 가 없기 때문에 작동합니다. Regex는 중첩된 구조를 자체적으로 처리하지 않습니다(그러나 패턴 일치는 처리할 수 있음).
div의 id=는 원하는 텍스트를 식별하므로 한동안은 상당히 강력할 수 있습니다.
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);"Mia Stephens가 JMP에서 기본적인 통계 분석을 수행하는 방법을 보여줍니다. 그녀는 분포를 사용하여 한 번에 하나의 변수씩 데이터를 분석하는 방법을 다룹니다. 두 개의 변수를 포함하는 분석에는 Fit Y by X를 사용하고, 두 개 이상의 변수를 포함하는 분석에는 Fit Model을 사용합니다. 그녀는 또한 데이터를 요약하고 그래프로 표시하는 도구도 검토합니다. 이 동영상의 세 번째 부분은 JMP 30일 무료 평가판이나 새로운 JMP 라이센스를 최대한 활용하기 위해 JMP를 사용하는 기본 방법을 배우는 시리즈입니다. JMP 학술 홍보대사인 Mia Stephens는 JMP 메뉴와 데이터 표를 탐색하고, 데이터를 JMP로 가져오고, 데이터를 요약 및 그래프화하고, 기본 통계 분석을 수행하는 방법을 보여줍니다. 이 데모에서는 9월에 출시될 JMP 11을 사용합니다. JMP 11에 어떤 기능이 추가되는지 확인하세요. http://www.jmp.com/software/preview-j ..."
Re: 웹페이지의 일부를 추출하는 중입니다.감사합니다 @마크_베일리 당신의 솔루션을 위해. 제가 시도한 모든 YouTube 동영상에서 깨끗한 문자열을 검색한다는 점에서 강력합니다. 그러나 설명의 단축 버전이 제공됩니다(알고 보니 각 비디오의 코드에는 전체 설명이 두 번, 간단한 설명이 세 번 포함되어 있습니다).
정규식 명령을 수정하려고 시도했지만 왜 그것이 귀하의 명령만큼 잘 작동하지 않는지 잘 모르겠습니다. 내 스크립트에 어떤 문제가 있는지 아시나요?
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
// this works well for the short version of the description.
final = Regex ( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
// not working for the long version of the description.
final = Regex ( page, "description\\!":{\!"simpleText\!":\!"(.+?)\\!"},", "\1" );
Re: 웹페이지의 일부를 추출하는 중입니다.감사합니다, @txnelson 좋은 방향을 위해서. 가장 기본적인 캐릭터 기능을 사용하여 이 작업을 수행했습니다.
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
startingpoint = Contains( page, "description\\!":{\\!"simpleText\\!":\\!"" );
rightremain = Substr( page, startingpoint + 32, Length( page ) );
endpoint = Contains( rightremain, "\\!"},\\!"lengthSeconds" );
final = Substr( rightremain, 0, endpoint - 1 );
Show( final );
이 시점에서 이 내용을 다른 YouTube 페이지에 복제하려고 했을 때 전체 설명의 접두사와 접미사가 다소 일치하지 않는다는 것을 알게 되었고, 각각에 대한 올바른 시작점과 끝점을 찾으려면 다양한 설명을 사용해야 했습니다.
Re: 웹페이지의 일부를 추출하는 중입니다.예전부터: Twitter 화면 스크래핑 및 FFT 기반 크로스페이드
이미지의 URL을 찾기 위해 정말 간단한 정규식을 사용하고 있습니다.
x = Load Text File( "https://twitter.com/search?q=football&src=typd" );//cat%20OR%20dog%20OR%20turtle%20OR%20rabbit
Pat Match( x, // look for links to jpgs in the html
Pat Regex( "https://[^\!"']+?\.jpg" ) >> link + Pat Test(
// reject some links to small images and duplicates
If( !Contains( link, "bigger" ) & !Contains( link, "normal" ) & duplicate << Contains( link ) == 0,
duplicate[link] = 1; // remember this keeper
dt << addrows( 1 ); // make a row for it
dt:url = link;
dt << runformulas;// make sure it loads
);
1;
) + Pat Fail()// this forces the match to keep trying, recording all links
);
PatRepeat를 사용하지 않고 PatFail()을 사용하여 반복합니다. PatFail은 결코 일치하지 않으며 일치자가 다음 위치에서 재시도하게 만듭니다. 그걸 발견할 때마다 https://<텍스트 없이 ! " 또는 ' >.jpg 패턴은 일부 JSL을 실행하여 URL을 처리합니다.
방금 시도해 보니 축구가 여전히 실행 가능한 검색어인 것 같습니다. 첫 번째 쿼리에서는 약 20장의 사진을 얻을 수 있으며 그 후 몇 분마다 새로운 사진을 얻을 수 있습니다.
HTML 태그를 사용하여 원하는 콘텐츠를 식별하는 올바른 경로에 있습니다.
Re: 웹페이지의 일부를 추출하는 중입니다.좋아요 @txnelson 제안. 문자열에 정규식을 사용할 수도 있습니다. 훔칠 수도 있지, 어, 내 말은 공부하다 텍스트 탐색기의 HTML 태그에 대한 정규식입니다. 문자 데이터가 있는 모든 열에서 실행하세요. (여기서 실제로 텍스트를 분석하는 것은 아닙니다.) 플랫폼 상단의 빨간색 삼각형을 클릭하고 구문 분석 옵션 > Regex 사용자 정의 . HTML과 관련된 표현은 여러 가지가 있습니다. 라이브러리로 이동하려면 표현식 목록 아래에 있는 추가 버튼(+)을 클릭하세요. 유망한 이름을 가진 것을 추가하십시오. 편집기를 사용하면 표현식을 검사하고 수정할 수 있습니다. 상단의 샘플 텍스트나 정의의 예를 통해 즉각적인 피드백을 받을 수 있습니다.
이것은 다음과 같이 간단할 수 있습니다.
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
내가 말했듯이 나는 이전 제안을 좋아합니다. 하지만 선택권이 있다는 것은 좋은 일이다.
Re: 웹페이지의 일부를 추출하는 중입니다.론,
나는 당신에게 필요한 순서대로 두 개의 파서를 작성했습니다.나는 일반적으로 Open() 함수를 사용하지 않지만 Loat Text File()을 사용하여 파일을 긴 문자열로 읽습니다.그런 다음 Contains()를 사용하여 시작점에 도달하고, Contains()에서 반환된 오프셋 뒤의 모든 문자 문자열을 Substr()에 사용합니다. HTML 파일을 읽고 있으므로 해당 마크업 언어의 구조를 사용하여 시작점과 구분 기호를 구성할 수 있습니다.
행운을 빌어 요