HTML 파일의 두 문자열 사이의 Bash Grep

HTML 파일의 두 문자열 사이의 Bash Grep

curl명령을 사용하여 파일을 다운로드했습니다 .htmlhomeoint.org/books/boericmm/d.htm그리고 파일로 저장해 보세요.

관련 부분은 다음과 같습니다.

      <p><font size="2"><a href="d/dam.htm" target="_top">DAM</a> ------&gt;
      DAMIANA (TURNERA)<br>
      <a href="d/daph.htm" target="_top">DAPH</a> ------&gt; DAPHNE INDICA<br>
      <a href="d/dig.htm" target="_top">DIG</a> ------&gt; DIGITALIS PURPUREA
      (DIGITALIS)<br>
      <a href="d/dios.htm" target="_top">DIOS</a> ------&gt; DIOSCOREA VILLOSA<br>
      <a href="d/diosm.htm" target="_top">DIOSM</a> ------&gt; DIOSMA LINCARIS<br>
      <a href="d/diph.htm" target="_top">DIPH</a> ------&gt; DIPHTHERINUM<br>
      <a target="_top" href="d/dol.htm">DOL</a> ------&gt; DOLICHOS PRURIENS
      (DOLICHOS PURIENS - MUCUNA)<br>
      <a href="d/dor.htm" target="_top">DOR</a> ------&gt; DORYPHORA
      DECEMLINEATA (DORYPHORA)<br>
      <a href="d/dros.htm" target="_top">DROS</a> ------&gt; DROSERA
      ROTUNDIFOLIA (DROSERA)<br>
      <a href="d/dubo-m.htm" target="_top">DUBO-M</a> ------&gt; DUBOISIA
      MYOPOROIDES (DUBOISIA)<br>
      <a href="d/dulc.htm" target="_top">DULC</a> ------&gt; DULCAMARA<br>
      &nbsp;</font></p>

grep의 값이 필요합니다

"&gt;" to "<br>"

출력은 다음과 같아야 합니다.

 DAMIANA (TURNERA)
 DAPHNE INDICA
 DIGITALIS PURPUREA (DIGITALIS)
 DIOSCOREA VILLOSA
 DIOSMA LINCARIS
 DIPHTHERINUM
 DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
 DORYPHORA DECEMLINEATA (DORYPHORA)
 DROSERA ROTUNDIFOLIA (DROSERA)
 DUBOISIA MYOPOROIDES (DUBOISIA)
 DULCAMARA

grep 명령을 사용하려고 합니다.

cat d.htm | grep -o -P '(?<=&gt; ).*(?=<br>)'

하지만 내 출력이 불완전합니다.

답변1

lynxHTML을 텍스트로 렌더링한 다음 각 줄 뒤의 공백 앞의 모든 항목을 sed제거하는 데 사용됩니다 >(그러나 실제 영향을 받는 줄만 인쇄).

$ lynx --dump 'http://homeoint.org/books/boericmm/d.htm' | sed -n 's/.*> //p'
DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA

lynx개행을 삽입하는 데 문제가 있는 경우 "페이지" 너비를 기본값 80에서 더 높은 숫자로 늘립니다 --width( lynx설명서 참조).

답변2

다중 문자 RS에 GNU awk 사용:

awk -v RS='&gt;|<br>' '!(NR%2){$1=$1; print}' file
DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA

답변3

tr개행 제거( tr -d $'\n') 및 중복 압축 <space>( tr -s ' ') 을 사용 하면 쉽게 다음을 수행할 수 있습니다 grep.

curl 'http://www.homeoint.org/books/boericmm/d.htm' \
| tr -d $'\n' \
| tr -s ' ' \
|  grep -Po '&gt; *\K[^<]*'

산출:

DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA

( grep일할 수도 있지만 .*욕심이 많고 필요합니다 .*?.)

답변4

python+를 사용하여 웹사이트를 구문 분석할 수 있습니다 BeautifulSoup.

사이트의 코드가 다음 html과 같기 때문에 이는 별로 좋지 않습니다.가장 나쁜연습이 필요하지만 효과가 있습니다.


파일에 넣으십시오 script.py.

#!/usr/bin/env python3
import requests
from bs4 import BeautifulSoup
import re

def parse(url):
    html = requests.get(url).text
    soup = BeautifulSoup(html, 'html.parser')
    items=(re.findall('(?<=&gt; )[^<]*', " ".join(str(soup.find_all("p")[4]).split())))
    for i in items:
        print (i)

parse('http://homeoint.org/books/boericmm/d.htm')

모든 페이지를 얻으려면(내 생각엔 당신이 하고 싶은 것...) 마지막 줄을 다음으로 바꾸세요:

import string
for c in list(string.ascii_lowercase):
    parse('http://homeoint.org/books/boericmm/'+c+'.htm')

그리고 실행 python script.py하거나python3 script.py

물론 종속성( bs4, re, requests)을 설치해야 합니다.

관련 정보