mech-dump

mech-dump

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>

^MControl+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여기에서 예를 참조하세요..

가능한 두 가지 해결책은 다음과 같습니다.

  1. STDERR에 파이프한 STDOUT다음 grep에 파이프하십시오.curl -v http://vimcasts.org/episodes/archive/ 2>&1 | grep archive
  2. --stderr플래그를 사용 하고 인수로 하이픈을 제공하십시오. 이것은 컬에게 그것을 사용하라고 지시할 것입니다 STDOUT.curl -v --stderr - http://vimcasts.org/episodes/archive/ | grep archive

관련 정보