curl획득, lynx구문 분석 및 awk추출 에 사용됩니다 .

curl획득, lynx구문 분석 및 awk추출 에 사용됩니다 .

이것을 고려하면:

<p>Currencies fluctuate every day. The rate shown is effective for transactions submitted to Visa on <strong>February 5, 2017</strong>, with a bank foreign transaction fee of <st <span><strong>1</strong> Euro = <strong>1.079992</strong> United States Dolla <p>The 'currency calculator' below gives you an indication of the cost of purchas <p>February 5, 2017</p><div class="clear-both"></div> <!-- removed clearboth- <p><strong>1 EUR = 1.079992 USD</strong></p> <div class="clear-both"></di <table width="290" border="0" cellspacing="0" cellpadding="3"> <a href="/content/VISA/US/en_us/home/support/consumer/travel-support/exchange e-calculator.html"> <button class="btn btn-default btn-xs"><span class="retur <p><p>This converter uses a single rate per day with respect to any two currencies. Rates displayed may not precisely reflect actual rate applied to transaction amount due to rounding differences, Rates apply to the date the transaction was processed by Visa; this may differ from the actual date of the transaction. Banks may or may not assess foreign transaction fees on cross-border transactions. Fees are applied at banks’ discretion. Please contact your bank for more information.</p>

추출해야해요1.079992

나는 다음을 사용하고 있습니다 :

sed -E 's:.*(1\.[0-9\.]+).*:\1:g

...이것은 작동합니다...하지만 더 우아한 방법이 있습니까?

또는 직접 값을 얻을 수 있는 방법이 있습니까 curl?

(내 전체 명령은 다음과 같습니다 curl 'https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017' | grep '<p><strong>1' | sed -E 's:.*(1\.[0-9\\.]+).*:\1:g' :)

답변1

curl획득, lynx구문 분석 및 awk추출 에 사용됩니다 .

을 (를) 사용하지 마십시오 sed. grepXML/HTML을 구문 분석하는 동안 기다리십시오. HTML은 컨텍스트 프리이지만 sed친구는 그냥 평범합니다. 1

url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'

curl -sA "${user_agent}" "${url}"  \
| lynx -stdin -dump                \
| awk '/1 EUR/{ print $4 }'

콘텐츠를 안정적으로 추출하려면 일종의 HTML 파서가 필요합니다. 여기서는 lynx텍스트 기반 웹 브라우저를 사용하고 있지만 더 가벼운 대안도 있습니다.

여기에서는 curl페이지가 검색된 다음 lynx구문 분석되고 덤프됩니다.텍스트 표현. 문자열 /1 EUR/이유를 검색하면 다음 줄만 발견되었습니다.awk1 EUR

   1 EUR = 1.079992 USD

그런 다음 { print $4 }네 번째 열인 1.079992.

대체 솔루션은 제공되지 않습니다curl

내가 선택한 HTML 파서는 다음과 같습니다 lynx.curl

url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'

lynx -useragent="${user_agent}" -dump "${url}"  \
| awk '/1 EUR/{ print $4 }'

1 A는 pcre( grep -P일부 구현에서는) 다음을 설명 할 수 있습니다.일부문맥이 없거나 상황에 맞는 문자열 집합이지만 전부는 아닙니다.


2017-12-23에 편집됨curl사이트가 현재 차단되어 있으므로 사용자 에이전트 문자열(Firefox인 척)을 추가하세요 lynx.

답변2

또 다른 해결책:html2text

curl -s 'https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=2/12/2017' \
| html2text \
| grep '1 Euro' \
| awk '{ print $4 }'

답변3

권장사항: xml/html 인식 도구를 사용하세요.

xmllint

curl "$url" | xmllint -html -xpath '//span/strong[2]/text()' - 

히델

curl "$url" | xidel -s -e "//span/strong[2]" -

심지어

xidel -e "/span/strong[2]" $url

답변4

pandoc변환을 사용한 json다음 python데이터를 추출합니다. 와 비교될 것입니다 grep.

이와 같이 stdin을 통해 입력을 받습니다.

pandoc  -f html -t json | python3 -c '
import json
import sys

output=[]
data = json.load(sys.stdin)

for i in data[1][0]["c"]:
    if i["t"]=="Strong":
        output.append((i["c"]))

print(output[2][0]["c"])
'

관련 정보