2011-09-30 7 views
1

파일의 URL에서만 & 기호를 제거하는 방법은 무엇입니까?

"/bbq-spareribs-&-sauce-eat-lean-&-fat.html""/bbq-spareribs--sauce-eat-lean--fat.html"가되도록 URL에서 & 기호를 제거해야합니다. 그러나 링크 텍스트 인 bbq spareribs & sauce (eat lean & fat)과 같이 URL이 아닌 파일 부분에서 & 심볼을 제거하지 않으려합니다.

표준 Linux 설치에서 어떻게하면됩니까? 작동하는 한 결과를 얻기 위해 사용 된 특정 도구/언어가 무엇인지는 중요하지 않습니다.

답변

2

당신이 BeautifulSoup를 설치 행복 경우,이 간단한 파이썬 스크립트는 당신이 원하는 것을 할 수 있습니다

#!/usr/bin/evn python 
import sys 
from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(sys.stdin.read()) 
for a in soup.findAll("a"): 
    a["href"] = a["href"].replace("&", "") 

print soup 

사용 예제를 :

[[email protected]]$ cat your.html | python amp_remover.py 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

경고 : S 출력 HTML을 파싱 된 표현을 기반으로 다시 생성하면 형식이 변경 될 수 있습니다. Markup이 잘 형성되지 않은 경우 태그를 명시 적으로 닫는 등의 다른 가능한 변경이있을 수 있습니다.

내가 틀릴 수도 있지만 올바른 XML/HTML 구문 분석기를 사용하는 대부분의 솔루션이 비슷한 문제를 일으킬 것으로 생각됩니다. 파일을 그대로 유지하고 불쾌한 문자 만 제거하려면 regex 기반 검색을 사용하고 결국 제거/교체해야합니다. 많은 사람들이 실제로는 사소한 패턴을 제외하고는 advice against parsing XML/HTML with regex입니다. 당신의 경우에 그것은 사실 일지 모르지만 나는 아직 확신하지 못하고 있습니다.

0

하나의 경로는 XML 패키지가있는 도구/언어를 사용하는 것입니다. 이 패키지는 앵커 요소의 href 속성에 프로그래밍 방식으로 쉽게 액세스 할 수 있도록 지원합니다. 따라서 다음과 같은 것을 가질 수 있습니다 :

aElements = doc.getElement('a') 

foreach aElement in aElements { 
string url = a.getHref() 
removeAmpersane (url) 
} 

거의 모든 언어 수준 도구에이 패키지가 포함되어있을 것입니다. 언어와 같은 무거운 도구를 열어두면 쉽게 사용할 수 있습니다. 저수준의 리눅스 툴을 원한다면 그것은 내가 알고있는 것 이상이다.

0

쉽게이를 위해 자바 스크립트를 사용할 수 있습니다

<head> 

<script type="text/javascript"> 
    document.onload = (function (ev) { 
    var links = document.getElementsByTagName('a'); 
    for (var i = 0; i < links.length; i++) { 
     var href = links[i].href.replace(/(&)/, ''); 
     console.log(links[i]); 
    } 
    }); 
</script> 

</head> 
2

당신은 간단한 명령 줄 정규식 도구를 사용하기로하고, 당신이 알고있는 경우에 당신의 URL의 좋은, 그리고 앰퍼샌드가 텍스트에서 지속적으로 사용하는 것이, 당신은 같은 것을 시도 할 수 :

$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html 

이것은 URL에 앰퍼샌드 옆에 공백이 없으며 URL에없는 앰퍼샌드는 항상 공백으로 묶여 있다고 가정합니다. 그래서 이것은 결코 튼튼하지는 않지만 한번만 필요하고 html을 예측할 수 있다면 Beautiful Soup를 설치하는 것보다 간단 할 수 있습니다.

1

awk-solution을 완전하게하기 위해. 간단한 작업 인 에 대해 충분히 안정적이어야합니다.

파일 :

$ cat file 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

출력 :

$ awk 'BEGIN{FS=OFS=">"}{for (i=1;i<=NF;i++){if ($i ~ "a href")gsub(/\&/,"",$i)}}1' file 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

HTH 크리스

관련 문제