이것을 고려하면:
<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
. grep
XML/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/
이유를 검색하면 다음 줄만 발견되었습니다.awk
1 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"])
'