2009-08-18 2 views
0

글쎄 <div id="links"></table> 태그 사이의 모든 링크를 추출하는 방법을 찾아야합니다. 그리고 둘 이상의 링크가있는 경우 URL 사이에 '\ n'문자를 추가해야합니다 : "$ URL1 \ n $ URL2".sed가있는 html 파일에서 지정된 html 태그 사이의 모든 링크를 추출하십시오.

<div id="links"> 
<table> 
<td><a href="URL">url</a></td> 
<td><a href="URL">url</a></td> 
</table> 
<table> 
.. 
</table> 
</div> 

<div> 태그와 제 </table> 태그 사이의 사람. sed 외에 다른 방법이 있습니까?

감사합니다.

+0

당신이 더 구체적 일 수 있다면 도움이 될 것입니다. 샘플 입력 중 일부는 어떤 모습입니까? –

답변

2

매일 같이 게시 됨 : 정규 표현식으로 HTML을 처리 할 수 ​​없습니다. Can you provide some examples of why it is hard to parse XML and HTML with a regex?

기본 정규 표현식과 함께 sed로 제한된 도구의 경우 두 배가됩니다.

당신이 가지고있는 입력의 종류가 매우 제한적이어서 모든 링크가 똑같은 형식으로되어 있다면 가능할 수도 있습니다. 그럴 경우 해당 형식의 예를 게시해야합니다. 그러나 일반적인 HTML 페이지의 경우에는 수행 할 수 없습니다.

ETA는 귀하의 예제를 제공 : 가장 단순한 수준에서 각 URL은 한 줄에 이미 있기 때문에, 당신은 당신이 원하지 않는 바로 보는 사람을 선택하고 비트를 멀리 던질 수 :

#!/bin/sed -f 
s/^<td><a href="\(.*\)">.*<\/a><\/td>$/\1/p 
d 

그러나 이것은 HTML 인코딩 형식으로 URL을 남겨 둡니다. 이 파일을 생성 한 스크립트가 해당 URL을 HTML 인코딩하는 경우 lt/gt/quot/amp 엔티티 참조의 인스턴스를 '<> "&"일반 문자 형식으로 바꿔야합니다. 실제로 귀하가 만날 가능성이있는 사용자 중 하나만 &/amp입니다. URL에 매우 일반적으로 표시됩니다.

하지만 실제로 HTML 인코딩이 전부가 아닙니다. 다른 HTML 엔터티 참조가있을 수 있습니다. , eacute (지금 우리는 IRIs가 ​​유효하다) 또는 숫자 참조 (십진수와 십진수 모두)와 같은 유니 코드를 포함하여 문자에 대한 2 백만 가지의 잠재적 인 인코딩 형식이있다. 지루함 속에서 방대한 운동을한다.

생성자 스크립트가 출력하지 않는다면 HTML 파서가 여전히 가장 좋습니다. (또는 잘 구성된 XHTML을 알고 있다면 간단한 XML 파서를 사용할 수 있습니다.이 라이브러리는 현대 언어의 표준 라이브러리에 내장되어 있습니다.)

+0

sed가 튜링이 완료되었으므로 가능합니다. 아마 그 일에 대한 잘못된 도구 일 수도 있지만 가능합니다. – Triptych

+0

내 친구가 Perl을 통해 가능하다고 말했지만 그걸 설치할 권한이 없습니다 ... –

+0

어떻게해야합니까? 나는 자동 생성되기 때문에 모든 링크가 똑같은 형식이라고 말할 수있다. –

0

Python에 액세스 할 수 있으면 BeautifulSoup를 (를) 사용하는 것이 좋습니다. HTML을 조작하기위한 훌륭한 파이썬 라이브러리. 다음 코드는 주어진 자원 (예 : http://www.foo.com)의 전체 이름 인 링크를 수집하여 파일에 저장합니다. 희망이 도움이됩니다.

import sys, os 
from urllib import urlopen 
from BeautifulSoup import BeautifulSoup 

fileLinksName = "links.dat" 

if __name__ == "__main__": 
    try: 
     # get all links so far 
     fileLinks = open(fileLinksName) 

     links = fileLinks.read().split('\n') 

     fileLinks.close() 

     htmlFileSoup = BeautifulSoup(urlopen(sys.argv[1]).read()) 

     anchorList = htmlFileSoup.findAll('a') 

     for htmlAnchor in anchorList: 
      print htmlAnchor 
      if 'href' in htmlAnchor: 
       links.append(htmlAnchor) 

     for link in links: 
      print link 
    except: 
     print sys.exc_info() 
     exit() 
0

URL을 찾는 태그를 보는 대신 가능하면 가능할 수 있습니다.

"[a-z]+://[^"]+" 
0

당신이 AWK에 액세스 할 수 있습니까 :이 페이지의 URL 만 인 경우

은 당신이 뭔가를 따옴표 사이에 URL을 찾기 위해 패턴을 쓸 수 있습니까?당신이 원하는 것을 할 수 나오지 AWK의 조합은이 제공 다음 HTML은 비교적 간단

  • HTML 갑자기 (내가하지 함량, 형태 의미) 변경되지 않습니다
  • html이 지나치게 복잡하지 않습니다.

HTML을 정규식으로 처리 할 수 ​​없다는 것은 잘못된 것입니다. 일반적인 경우에 정규 표현식으로 HTML (또는 XML)을 처리 할 수 ​​없다는 것은 사실입니다. 왜냐하면 임의의 중첩을 허용하고 정규 표현식이 재귀를 전혀 또는 전혀하지 않기 때문에. 그러나 HTML이 상대적으로 '평평한'것이라면 정규식으로 확실히 할 수 있습니다.

내가 뭘 좀 AWK를 잊어 내가 대학에서 배운 나오지했기 때문에 나는 할 정확히 말할 수는 없지만,이 행할 수있는 무언가로 저를 친다 :

  • 찾기 문자열 <div id="links">
  • 이제 문자열을 찾으십시오. <table>
  • 이제 <td>...</td> 문자열을 찾아서 링크를 가져옵니다 (이것은 정규 표현식 부분입니다). 당신이 문자열을 찾을 때까지
  • 는 VAR $links
  • 에 추가 </table>
  • 마지막으로, \n 각 링크를 분리 인쇄 $links.

다시 간단한 사례에 대한 의사 코드입니다. 그러나 그것은 효과가있을 것입니다.

AWK에 대해 언급합니다. Perl에 대한 액세스 권한이 없더라도 sed와 AWK가 모두 설치되는 경향이 있기 때문입니다.

마지막으로 pure sed 솔루션의 경우 this sed recipe을 살펴보고 필요에 맞게 조정할 수 있습니다.