grep
저는 웹페이지의 모든 링크를 가져온 다음 원하는 콘텐츠를 가져오기 위해 다음 명령을 사용했습니다 .
curl $URL 2>&1 | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | egrep $CMP-[0-9].[0-9].[0-9]$ | cut -d'-' -f3
어제까지만 해도 잘 지내고 있었어요. 나는 curl
스스로 실행해 보았고 그것이 반환되는 것을 보았습니다.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
명령이 작동하지 않게 만드는 업데이트가 있습니까?
편집 1:
wget
나는 문제에 대한 태도를 바꾸었다이 답변:
wget -q $URL -O - | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | egrep $CMP-[0-9].[0-9].[0-9]$ | cut -d'-' -f3
curl
하지만 왜 이 방법이 갑자기 작동을 멈췄는지 는 아직 알 수 없습니다 .
답변1
경고: 정규식을 사용하여 HTML 구문 분석대부분의 경우(모두는 아닐 경우) 예나쁜이므로 귀하의 재량에 따라 진행하십시오.
이렇게 하면 트릭을 수행할 수 있습니다.
curl -f -L URL | grep -Eo "https?://\S+?\""
또는
curl -f -L URL | grep -Eo '"(http|https)://[a-zA-Z0-9#~.*,/!?=+&_%:-]*"'
노트:
이는 "전체"가 아닌 링크 또는 기본적으로 전체 링크의 일부만 표시되는 "절반 링크"라고 부르는 링크를 고려하지 않습니다. 이것을 어디서 봤는지 기억나지 않지만 일부 웹사이트에서는 특정/특정 HTML 태그 아래에 나타날 것입니다.편집하다:길 키노"세미 링크"(올바른 용어는 상대 링크)로 잘못 설명한 것에 대한 해결책을 제공해 주십시오.
curl -Ls URL | grep -oP 'href="\K[^"]+'
- 또한 링크의 일부가 아닌 항목(예: "&" 문자 등)은 "정리"되지 않습니다. 제거하려면 sed 또는 이와 유사한 것을 만들거나 사용하십시오.
curl -f -L URL | grep -Eo "https?://\S+?\"" | sed 's/&.*//'
마지막으로, 이는 링크가 나타날 수 있는 모든 가능한 방법을 고려하지 않습니다. 따라서 웹페이지 구조나 HTML에 대한 지식이 필요합니다. 위 구조나 웹 페이지 자체의 예를 보여줄 수 없거나 보여줄 수 없다는 점을 감안할 때 더 많은 HTML 지식이 없으면 이에 적용되는 답변을 만들기가 어렵습니다.
추신: 이것은 명백할 수도 있고 그렇지 않을 수도 있지만, 컬은 주로 정적 링크에 적합하기 때문에 동적으로 생성된 링크/URL(예: PHP, JS 등)을 고려하지 않습니다.
PS(2): HTML을 구문 분석하는 더 나은 방법을 사용하려면 다음의 더 나은 답변을 사용해야 합니다.길 키노이는 일반(예: 완전) 및 더욱 최적화된 HTML 구문 지원에 더 적합합니다.
이 경우처럼 자신이 무엇을 하고 있는지 모르거나 요구사항이 매우 제한적(예: 링크만)인 경우가 아니면 정규식을 사용하여 HTML을 구문 분석하는 것을 권장하지 않습니다.
답변2
정규식을 사용하여 HTML을 구문 분석하는 것에 대한 일반적인 논의가 있습니다. 이는 나쁜 생각입니다. 대신 적절한 파서를 사용하세요.
mech-dump
mech-dump --links --absolute --agent-alias='Linux Mozilla' <URL>
소프트웨어 패키지 www-mechanize-perl
(Debian 기반 배포판)와 함께 제공됩니다.
(작가:앤디 레스터ack
, 그리고 더 많은)
xidel
또는saxon-lint
또는길&회로망xidel
또는 다음 과 같은 인식 도구 saxon-lint
:
xidel -se '//a/@href' <URL>
saxon-lint --html --xpath 'string-join(//a/@href, "^M")' <URL>
^M
예Control+v Enter
xmlstarlet
:
curl -Ls <URL> |
xmlstarlet format -H - 2>/dev/null | # convert broken HTML to HTML
xmlstarlet sel -t -v '//a/@href' - # parse the stream with XPath expression
javascript
생성된 웹페이지
당신 XPath
도 할 수 있습니다puppeteer
자바스크립트 스크립트
const puppeteer = require('puppeteer');
var base_url = 'https://stackoverflow.com';
(async () => {
const browser = await puppeteer.launch({
headless: true,
});
// viewportSize
await page.setViewport({'width': 1440, 'height': 900});
// UA
await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0')
// open main URL
await page.goto(base_url, { waitUntil: 'networkidle2' });
const xpath_expression = '//a[@href]';
await page.waitForXPath(xpath_expression);
const links = await page.$x(xpath_expression);
const link_urls = await page.evaluate((...links) => {
return links.map(e => e.href);
}, ...links);
await browser.close();
link_urls.forEach((elt) => console.log(elt));
})();
용법:
nodejs retrieve_all_links.js
답변3
-s
자동 모드에서 사용되는 컬의 매개변수를 사용할 수 있습니다 . 진행률 표시기나 오류 메시지는 표시되지 않습니다.
답변4
문제는 컬이 전달 STDERR
하면서 출력을 로 보낸다는 것입니다 .|
STDOUT
여기에서 예를 참조하세요..
가능한 두 가지 해결책은 다음과 같습니다.
STDERR
에 파이프한STDOUT
다음 grep에 파이프하십시오.curl -v http://vimcasts.org/episodes/archive/ 2>&1 | grep archive
--stderr
플래그를 사용 하고 인수로 하이픈을 제공하십시오. 이것은 컬에게 그것을 사용하라고 지시할 것입니다STDOUT
.curl -v --stderr - http://vimcasts.org/episodes/archive/ | grep archive