HTML 테이블과 해당 "헤더"를 구문 분석해야합니다. 이 두 가지 모두 같은 URL에 포함되어 있습니다.WGET - 단 하나의 HTTP 요청을 사용하여 동일한 소스에서 여러 XPath 가져 오기
- 이름을 가져 오기 변수
$header
- 에 전달 테이블을 얻고 하위 노드
<td>$header</td>
을 추가 :
이
#!/bin/bash
name_query="html/body/div[3]/div/div[1]/div[3]/div[1]/h1/text()"
# Use xargs to TRIM result.
header=$(wget -O - "https://example.com/section-1/name-1/financial-data/" |
xmllint --html --xpath "$name_query" - 2>/dev/null |
xargs)
wget -O - "https://example.com/section-1/name-1/financial-data/" |
xmllint --html --xpath '//*[@id="financial-data"]/div/table/tbody' - 2>/dev/null |
xmlstarlet ed --subnode "/tbody/tr" --type elem -n td -v "$header" >> /Applications/parser/output.txt
이 두 가지 요청을한다 : 이것은 내가 지금까지 무엇을 가지고
따라서 다음은 내 output.txt 파일에 다음을 씁니다.
<tbody>
<tr class="text-right">
<td class="text-left">Sep 08, 2017</td>
<td>4605.16</td>
<td>4661.00</td>
<td>4075.18</td>
<td>4228.75</td>
<td>2,700,890,000</td>
<td>76,220,200,000</td>
<td>Name 1</td>
</tr>
<tr class="text-right">
<td class="text-left">Sep 07, 2017</td>
<td>4589.14</td>
<td>4655.04</td>
<td>4491.33</td>
<td>4599.88</td>
<td>1,844,620,000</td>
<td>75,945,000,000</td>
<td>Name 1</td>
</tr>
...
</tbody>
실제로 동일한 요청을 두 번 수행하기 때문에 상대적으로 느리고 어떻게 든 비효율적입니다. 나는 이것이 하나의 요청을 통해서만 이루어질 수 있다고 믿습니다.
내가 좋아하는 뭔가를 찾고 :
#!/bin/bash
name_query="html/body/div[3]/div/div[1]/div[3]/div[1]/h1/text()"
content=$(wget -O - "https://example.com/section-1/name-1/financial-data/")
# Use xargs to TRIM result.
header=$($content | xmllint --html --xpath "$name_query" - 2>/dev/null | xargs)
$content |
xmllint --html --xpath '//*[@id="financial-data"]/div/table/tbody' - 2>/dev/null |
xmlstarlet ed --subnode "/tbody/tr" --type elem -n td -v "$header" >> /Applications/parser/output.txt
이 작동하고 다음과 같은 오류 발생하지 않습니다
./test: line 8: <!DOCTYPE: command not found
./test: line 10: <!DOCTYPE: command not found
-:1.1: Document is empty
그리고 네, 실제로 출력 파일이 비어 있습니다. 나는 이유를 알 수 없다.
대체 답변
이 접근하는 또 다른 방법 것은 herestring을 사용하는 것입니다 :
#!/bin/bash
title_query="html/body/div[3]/div/div[1]/div[3]/div[1]/h1/text()"
content=$(wget -O - "https://coinmarketcap.com/currencies/bitcoin/historical-data/")
# Use xargs to TRIM result.
header=$(xmllint --html --xpath "$title_query" - <<<"$content" 2>/dev/null | xargs)
xmllint --html --xpath '//*[@id="financial-data"]/div/table/tbody' - <<<"$content" 2>/dev/null |
xmlstarlet ed --subnode "/tbody/tr" --type elem -n td -v "$header" >> /Applications/parser/output.txt
이 <<<"$content"
도 날 위해 일했습니다.
예라고 생각한다! @Fabricio는 매력처럼 작동합니다. 고맙습니다 :) –