2012-03-23 3 views
0

YouTube 재생 목록 페이지를 스크래핑하는 동안 일부 Regex 코드에 문제가 있습니다. 그것은 대부분 잘 작동하지만 이상한 결과Regex 문제 - YouTube 스크랩

의 몇 가지를 따기

표현 : 골라 무엇의

(?<=v=)[a-zA-Z0-9-_]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+ 

예 :이

https://www.youtube.com/watch?v=_ClmClS_Mqs&list=PL6422619E56951B73&index=5&feature=plpp_video 
같은 링크에서

yXBckFyiMyU, 
opWYnUpNtG8, 
YFbLRZCExBk, 
I_GZahAl-PQ, 
G6F_iP-F7Fw 

대부분이 부분은 정상적으로 작동하는 것처럼 보입니다. 그러나이 인스턴스도 선택 중입니다.

data-thumb="//i1.ytimg.com/vi/84GVRtJ1CvY/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" ><span class="vertical-align"></span></span></span></span> 

data-thumb="//i4.ytimg.com/vi/WNIPqafd4As/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" alt="" class="thumb"></span></span></span><span class="clip"><span class="centering-offset"><span class="centering"><span class="ie7-vertical-align-hack"> 

Regex는 다소 위압적입니다. 누구든지 표현이 잘못되었다는 것을 알고 있습니까?

+0

당신이 요소의 트리를 구축하는 일부 HTML 파서를 사용하여 고려했으며, 만 볼 수있는 링크 정규 표현식을 적용 그 나무에? [Here] (http://stackoverflow.com/a/1732454/960195)는 정규 표현식과 전용 구문 분석기를 사용하여 HTML을 구문 분석하는 해학적 인 의견입니다. –

+0

@ Adam : 우리는 임의의 HTML을 구문 분석하려고하지 않고 URL 만 분석합니다. Cthulu/Tony the Pony는 정규 표현식으로 이것을 시도하기 위해 당신의 영혼을 소비하지 않을 것입니다. (적절한 HTML과 URL 구문 분석 라이브러리가 여전히 권장됩니다.) 좋은 대답은 –

답변

4

제안 사항에 따라 일치시키려는 문자열은 항상 11 자입니다. + 한정 기호를 사용하여 "가능한 한 많은 문자"를 대조하는 대신 {11} 한정 기호를 사용하여 "정확히 11 자"와 일치시킵니다.

이것은 왜 처음에 그 문자열과 일치하는지 모르겠지만 당신이보고있는 일치하는 문제의 증상을 치료할 수 있습니다.

((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+) 

을하고 정규식 맛이 자세한 정규식 (주석 내부 정규 표현식에)를 지원하는 경우 그들을 사용

당신은 아마 parenthesising하여 교대를 | 명확히해야한다. (그들은 v=로 시작하지 않음)! 제안으로


- 정규식으로 URL을 구문 분석은 불쾌한입니다. 내가 대신 것 :

  • 는 HTML 파서를 사용하여 페이지에있는 모든 URL 목록 얻을
  • 구문 분석 각각의 URL (파이썬에서 나는 아주 쉽게 '모든 링크'얻을 수 있습니다 BeautifulSoup를 사용하는 것입니다.) parse_url() (더 많은 Python)을 사용하여 GET 속성의 사전/해시를 얻습니다. 예 :

    { 
    'v' : '_ClmClS_Mqs', 
    'list' : 'PL6422619E56951B73', 
    'index' : '5' 
    'feature' : 'plpp_video', 
    } 
    

    그럼 그냥 GET 속성 v을 요청할 수 있습니다처럼

사전은 볼 수 있습니다. regexes가 필요하지 않습니다.

이것은 파이썬에 따라 다르지만 Java에는 해당 항목이 있습니다. 요점은 정규식은 항상 최고의 도구되지 않는 것입니다 (다만 가장 일반적인 도구입니다.)

+0

+1이고, 정규 표현식은 항상 가장 좋은 * 도구가 아닙니다.) " –

+0

도와 주셔서 감사합니다. 앞으로 더 많이 긁어 모을 계획이지만이 전체 프로젝트가 거의 작동하므로 당분간 정규식을 유지할 것입니다. 귀하의 제안은이 문제를 거의 해결했으며 현재는 '이라고 생각합니다. 왜 그런지 알아? – CitizenSmif

+0

유쾌한 대답은 "당신의 정규식이 충분하지 않다"입니다. ;) 더 심각하게, 당신의 정규식은 실제로 3 개의 정규 표현식입니다 - 세 개의 하위 정규 표현식 중 어느 것이 잘못된 일치를 생성하는지 보려고 그들을 분리해볼 수 있습니까? (분할하여 정복하여 디버깅.) –