我正在尝试用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)
?
答案 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。
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