2017-09-14 1 views
1

HTML 테이블과 해당 "헤더"를 구문 분석해야합니다. 이 두 가지 모두 같은 URL에 포함되어 있습니다.WGET - 단 하나의 HTTP 요청을 사용하여 동일한 소스에서 여러 XPath 가져 오기

  1. 이름을 가져 오기 변수 $header
  2. 에 전달 테이블을 얻고 하위 노드 <td>$header</td>
  3. 을 추가 :

    #!/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"도 날 위해 일했습니다.

답변

1

당신은 $ content var로 무엇을하고 있는지를 bash에게 알려주는 것을 잊었습니다.

그리고 배쉬는 $ 내용이 무엇인지 명령

사용

echo $content | .... 
+0

예라고 생각한다! @Fabricio는 매력처럼 작동합니다. 고맙습니다 :) –

관련 문제