웹 페이지(html)의 일부 목록을 "파싱"하고 싶습니다. "파싱"하려면 <title> </title>
태그 사이의 콘텐츠를 일부 특정 파일로 리디렉션하면 됩니다. 먼저 for
루프를 사용한 wget
다음 ( time
물론) curl
이 경우가 더 빠르다는 결론을 내립니다.
그래서 그것은 다음과 같습니다:
for page in $(cat source.txt)
do
echo "$(curl -s https://somewebpage/some_sub_page/$page \
| grep '<title>' -A2 | sed -n '2p')" > tmp/$page/index
done
이 모든 하위 페이지에는 <title>
아래와 같이 내가 관심을 갖는 정보가 포함되어 있습니다.
<title>
...
</title>
그래서 결과를 얻기 위해 일반적인 쉘 도구를 적용했습니다. 내 문제는 무엇입니까? 약 400페이지이므로 전체 페이지를 로드한 다음 grep
페이지를 로드하는 등의 작업에 많은 시간이 걸립니다 . HTML 문서의 처음 10줄만 로드하는 것과 같이 좀 더 복잡한 로드 솔루션이 있습니까? 저는 고전적인 bash 유틸리티(curl, wget)를 사용하지만 이 문제에 더 적합하다고 생각되는 유틸리티를 추천해 주실 수 있습니다.
UPD: 어쩌면 이것이 완벽한 해결책은 아닐 수도 있지만 head
스크립트를 두 번 줄인 후에 추가되었습니다. (복사)curl
time
답변1
올바른 방법으로 시도해 보세요.길표현하다:
주문하다:
saxon-lint --html --xpath '//title/text()' http://domain.tld/path
확인하다색슨 린트(자체 프로젝트)
당신은 테스트할 수 있습니다xmllinthttps
(그러나 대부분의 경우 HTML 파서는 STDERR을 숨겨야 하며 이는 지원되지 않습니다.저것이전에 작성한 명령만큼 좋습니다)
xmllint --html --xpath '//title/text()' http://domain.tld/path 2>/dev/null
마침내:
for page in $(cat source.txt); do
chosen_command "https://somewebpage/some_sub_page/$page" > "/tmp/$page/index"
done
답변2
여기에 들어가고 싶은 내용을 파이프할 수 있습니다.
wget -4 -qO- {$query} |\
html2text |\
awk '/<title>/,/<\/title>/{print}'
답변3
일반적으로 HTTP 성능을 제한하는 요소는 대역폭이 아니라 대기 시간입니다. 따라서 페이지의 일부만 로드하는 것이 성능에 큰 영향을 미칠 것이라고는 기대하지 않습니다. 그러나 HTTP는 이를 수행하는 메커니즘(범위 요청)을 제공합니다. 그리고 물론,cURL 지원.
하지만제목에 대한 엄격한 요구 사항HTML 콘텐츠의 시작 부분, 바로 나타나는 위치에 나타납니다.마음에.
페이지가 약 400페이지 정도 되는데, 전체 페이지를 로딩하는데 시간이 많이 걸립니다.
위에서 언급했듯이 여기서는 많은 이점을 얻을 수 없을 것 같습니다(비록 제가 틀렸다면 데이터그램 모델보다는 스트림 기반 프로세서 구현을 고려해야 합니다). 더 빠르게 결과를 얻으려면 워크로드를 분할하고 여러 핸들러를 병렬로 실행하세요.