我有一个简单的程序正在抓取某个项目的网站。我使用Angular $ http服务调用下面的C#方法从页面获取标记,然后用JS处理其他所有内容。除了轻微的烦恼之外,一切都工作得非常好:一堆404错误。
http get调用完成后,开发人员工具中将显示404错误。这几乎就像javascript试图解释HTML一样,然后在浏览器中对图像的所有get请求失败:
我想弄清楚的是如何让404错误消失或无声地失败(不在控制台中显示)。我在研究中没有找到任何东西,但我认为无论是在服务器端还是客户端,都有办法解决这个问题
C#
public static string GetPageSource()
{
JObject result = new JObject();
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://awebpage.html");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
result["data"] = reader.ReadToEnd();
result["success"] = true;
reader.Close();
response.Close();
}
catch (Exception ex)
{
result["data"] = ex.Message;
result["success"] = false;
}
return JsonConvert.SerializeObject(result);
}
JS
$scope.getPageSource = function () {
var ajaxProcessor = Utils.ajaxMessage('Scraping Beer Menu From Source');
ajaxProcessor.start();
$http({
method: 'POST',
url: 'AJAX/MenuHandler.aspx/GetPageSource',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: {}
}).then(function (response) {
ajaxProcessor.stop();
var result = $.parseJSON(response.data.d);
if (result.success === false) {
Utils.showMessage('error', result.data);
} else {
var beerMenu = new BeerMenu(result.data, $scope.loggedInUser, function (beerMenu) {
$scope.buildDisplayMenu(beerMenu);
});
}
}, function (err) {
ajaxProcessor.stop();
console.log(err);
Utils.showMessage('error', err.data.Message);
});
};
更新
感谢@dandavis,我的问题缩小到在buildDisplayMenu函数(调用buildCurrentMenu)中调用$ .parseHTML。反正有没有让它忽略图像或任何获取请求?
buildCurrentMenu: function () {
var html = $.parseHTML(this.pageSource);
var menuDiv = $(html).find('.TabbedPanelsContent')[0];
var categories = $(menuDiv).find('h2');
var categegoryItems = [];
var beerArray = [];
for (var i = 0; i < categories.length; i++) {
...
}
return beerArray;
}
答案 0 :(得分:1)
解决方法是在调用$.parseHTML
之前从页面源中删除任何img标记(或任何其他应忽略的标记)
this.pageSource = this.pageSource.replace(/<img[^>]*>/g, "");
答案 1 :(得分:0)
编辑:基于对问题的更好理解,这个解决方案是过度杀戮并且掩盖了症状而不是解决问题,但是无论如何我都会把它留在这里,以防它有助于类似的人未来的问题。
临时解决方案:
从控制台过滤:我尝试使用谷歌Chrome正则表达式过滤器,但它没有工作^(?!.*404).*$
通常这个正则表达式应该工作。但是,如果您想要一个快速的短期解决方案并且您不关心其他警告,您可以通过单击其选项卡禁用警告
永久解决方案:
如果您有权访问服务器,则可以修改.htaccess以将不存在的请求重定向到特定地址
将以下内容添加到您网站的.htaccess
# detect based on mime type RewriteCond %{HTTP:Accept} someregexhere [NC]
# or rely on file extensions #regex begins here
RewriteCond %{REQUEST_FILENAME} ^.*(png|jpg|jpeg|js|css|pdf)$
# check to see if is a non-existent directory
RewriteCond %{REQUEST_FILENAME} !-d
# check to see if is a non-existent file
RewriteCond %{REQUEST_FILENAME} !-f
# permanently redirect to nowhere
RewriteRule ^.*$ '' [R=302,L]
在这种情况下,我们只是忽略不存在的内容文件并将它们发送到任何地方,导致浏览器无声地失败。或者我们可以使用逆过滤器来重定向404以及除了php和html之外的所有内容,例如:
# rely on file extensions #regex begins here
RewriteCond %{REQUEST_FILENAME} ^(?!.*(html|php)).*$
由于我们正在检查文件扩展名,因此我们不必区分在其中包含点并且可能是文件请求的请求以及不具有文件夹请求且可能是文件夹请求的请求。
我们使用临时重定向(302),以防文件稍后上传。