在Shell脚本中使用CURL解析HTML

时间:2016-03-22 14:27:05

标签: html shell curl

我正在尝试用shell脚本解析网页的特定内容。

我需要grep <div>标记内的内容。

<div class="tracklistInfo">
<p class="artist">Diplo - Justin Bieber - Skrillex</p>
<p>Where Are U Now</p>
</div>

如果我使用grep -E -m 1 -o '<div class="tracklistInfo">',则简历仅为<div class="tracklistInfo">

如何访问艺术家(Diplo - Justin Bieber - Skrillex)以及标题(Where Are U Now)

4 个答案:

答案 0 :(得分:0)

唐&#39;吨。使用HTML解析器。例如,Python的BeautifulSoup易于使用,并且可以非常轻松地完成此任务。

话虽如此,请记住grep适用于。模式匹配每个,而不是整个字符串

您可以使用-A来匹配后打印出的行:

grep -A2 -E -m 1 '<div class="tracklistInfo">'

应输出:

<div class="tracklistInfo">
<p class="artist">Diplo - Justin Bieber - Skrillex</p>
<p>Where Are U Now</p>

然后,您可以通过将其汇总到tail来获取最后一行或倒数第二行:

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n1
<p>Where Are U Now</p>

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' |  tail -n2 | head -n1
<p class="artist">Diplo - Justin Bieber - Skrillex</p>

使用sed删除HTML:

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n1
Where Are U Now

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' |  tail -n2 | head -n1 | sed 's/<[^>]*>//g'
Diplo - Justin Bieber - Skrillex

但正如所说,这是善变的,可能会破裂,而且不是很漂亮。顺便说一句,这里和BeautifulSoup一样:

html = '''<body>
<p>Blah text</p>
<div class="tracklistInfo">
<p class="artist">Diplo - Justin Bieber - Skrillex</p>
<p>Where Are U Now</p>
</div>
</body>'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')

for track in soup.find_all(class_='tracklistInfo'):
    print(track.find_all('p')[0].text)
    print(track.find_all('p')[1].text)

这也适用于多行tracklistInfo - 将其添加到shell命令需要更多工作; - )

答案 1 :(得分:0)

cat - > file.html << EOF
<div class="tracklistInfo">
<p class="artist">Diplo - Justin Bieber - Skrillex</p>
<p>Where Are U Now</p>
</div><div class="tracklistInfo">
<p class="artist">toto</p>
<p>tata</p>
</div>
EOF


cat file.html | tr -d '\n'  | sed -e "s/<\/div>/<\/div>\n/g" | sed -n 's/^.*class="artist">\([^<]*\)<\/p> *<p>\([^<]*\)<.*$/artist : \1\ntitle : \2\n/p'

答案 2 :(得分:0)

使用xmllint:

a='<div class="tracklistInfo">
<p class="artist">Diplo - Justin Bieber - Skrillex</p>
<p>Where Are U Now</p>
</div>'

xmllint --html --xpath 'concat(//div[@class="tracklistInfo"]/p[1]/text(), "#", //div[@class="tracklistInfo"]/p[2]/text())' <(echo "$a")

您获得:

Diplo - Justin Bieber - Skrillex#Where Are U Now

这很容易分开。

答案 3 :(得分:0)

您的标题以“ 使用CURL解析HTML ”开头,但是curl不是html解析器。如果要使用命令行工具,请改用

xidel -s "<url>" -e '//div[@class="tracklistInfo"]/p'
Diplo - Justin Bieber - Skrillex
Where Are U Now

xidel -s "<url>" -e '//div[@class="tracklistInfo"]/join(p," | ")'
Diplo - Justin Bieber - Skrillex | Where Are U Now