【发布时间】:2016-09-15 11:21:22
【问题描述】:
据我所知,在 Bash 中解析 html 通常被认为是个坏主意。但是一个人永远不会在骑自行车的过程中不摔倒几次。
因此,我尝试使用 Bash 从 html 网页中提取一些数据。我试图获得的相关部分是data-nick="someguy99"这是一个用户名,然后消息"Hello. This is the data I wish to obtain."显示在正下方的行上。
<body>
<div id="main">
<div class="content">
<div class="block">
<div class="section">
<div class="chat-holder">
<div class="chat-box">
<div class="chat-list">
<div id="0" class="text" style="color: rgb(73, 73, 73);">
<span class="username messagelabel" data-nick="someguy99">someguy99:</span>
"Hello. This is the data I wish to obtain."
使用wget 我无法遍历"chat-list"。我尝试将输出通过管道传输到其他程序wget -O - http://website.url | lynx -source -dump 但没有任何效果。总是相同的输出。例如:
wget --quiet -F -O - http://website.url/example | \
lynx -dump -source -stdin | grep 'chat-list'
结果……
var img = $('.chat-list img[title="' + slug + '"]');
这与使用网络浏览器时在文档树中看到的输出不同。并且用grep 'data-nick' 替换grep 'chat-list' 根本不会返回匹配的模式。
我做错了什么?如何更深入地解析以获得我要寻找的数据?
我的大脑现在感觉有点炸,所以如果我遗漏了任何相关信息,请告诉我,我会提供更多详细信息。
- Mac OS X 10.11.5
- GNU bash 4.3.42
谢谢。
【问题讨论】:
-
您说“总是相同的输出”,但您忽略了该输出可能是什么。 “它不起作用”从不是一个充分的问题陈述。
-
虽然实际上如果那是真实数据(到底是什么 = $0 在那里做什么?)那么很明显 html 解析器会遇到类属性中缺少双引号的问题(
section和text,在您的摘录中)。这也会使使用浏览器阅读页面变得很棘手。你能让页面的所有者修复他们的标记吗? -
您是对的,对此我深表歉意。我已经编辑了问题以显示我得到的输出。那 = $0 不应该在那里。我的错。缺少的引号只是我的输入错误。
-
您能否澄清您问题中的文字来自何处?它是网络服务器返回的实际文本,还是您通过从实际网页检查 DOM 获得的?使用现代浏览器的“inspect”功能和使用“view source”是有很大区别的。
-
...如果您确实想 grep 网页的来源,则不需要
lynx;您可以将wget直接通过管道传输到grep。所以我的猜测是,您正在尝试获取由浏览器中运行的 javascript 组装的 DOM。这与解析完全不同。