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

用于lynx将 HTML 渲染为文本,然后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.pypython3 script.py

当然,您需要安装依赖项(bs4rerequests)。

相关内容