使用 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())' <<<"$a"
您将获得:
Diplo - Justin Bieber - Skrillex#Where Are U Now
可以轻松分离。
您的标题以“Parse HTML with CURL”开头,但
curl
不是 html 解析器。如果您想使用命令行工具,请使用xidel。
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
不要。使用 HTML 解析器。例如,Python 的 BeautifulSoup 很容易使用,并且可以很容易地做到这一点。
话虽这么说,请记住
grep
适用于 lines。该模式匹配每条行,而不是整个字符串。
您可以使用
-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 命令需要更多工作;-)
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'
因为这会出现在搜索中,所以这里还有一些用于从 HTML 中提取数据的 CLI 工具:
这是 github 上这些项目的受欢迎程度图表: