Java 在检查响应标题时仅爬网HTML页面
我试图获取所有标题为Content-Type:text/html的url,因此我检查每个url的响应标题,如果它们的内容类型为text/html,那么我想打印内容类型为text/html的url。但是在我的代码中,当我检查头是否有内容类型时,它没有显示任何内容。。如果我删除了If循环,那么它会打印与我要爬网的特定url相关的每个链接及其响应头Java 在检查响应标题时仅爬网HTML页面,java,web-crawler,Java,Web Crawler,我试图获取所有标题为Content-Type:text/html的url,因此我检查每个url的响应标题,如果它们的内容类型为text/html,那么我想打印内容类型为text/html的url。但是在我的代码中,当我检查头是否有内容类型时,它没有显示任何内容。。如果我删除了If循环,那么它会打印与我要爬网的特定url相关的每个链接及其响应头 public class MyCrawler extends WebCrawler { Pattern filters = Pattern.co
public class MyCrawler extends WebCrawler {
Pattern filters = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g"
+ "|png|tiff?|mid|mp2|mp3|mp4" + "|wav|avi|mov|mpeg|ram|m4v|pdf"
+ "|rm|smil|wmv|swf|wma|zip|rar|gz))$");
/*
Pattern filters = Pattern.compile("(\\.(html))");
*/
public MyCrawler() {
}
public boolean shouldVisit(WebURL url) {
String href = url.getURL().toLowerCase();
//System.out.println("Href: " +href);
/*
if (filters.matcher(href).matches()) {
return false;
}*/
if (href.startsWith("http://www.somehost.com/")) {
return true;
}
return false;
}
public void visit(Page page) {
int docid = page.getWebURL().getDocid();
String url = page.getWebURL().getURL();
String text = page.getText();
List<WebURL> links = page.getURLs();
int parentDocid = page.getWebURL().getParentDocid();
//HttpGet httpget = new HttpGet(url);
try {
URL url1 = new URL(url);
URLConnection connection = url1.openConnection();
Map responseMap = connection.getHeaderFields();
for (Iterator iterator = responseMap.keySet().iterator(); iterator.hasNext();)
{
String key = (String) iterator.next();
if(key==("Content-Type")) //(Anything wrong with this if loop)
{
System.out.print(key + " = ");
List values = (List) responseMap.get(key);
for (int i = 0; i < values.size(); i++) {
Object o = values.get(i);
System.out.print(o + ", ");
}
System.out.println("");
System.out.println(url1);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//System.out.println("Docid: " + docid);
//System.out.println("URL: " + url);
//System.out.println("Text length: " + text.length());
//System.out.println("Number of links: " + links.size());
//System.out.println("Docid of parent page: " + parentDocid);
System.out.println("=============");
}
}
公共类MyCrawler扩展WebCrawler{
Pattern filters=Pattern.compile(“.*(\\)(css|js|bmp|gif|jpe?g)”
+“| png | tiff | mid | mp2 | mp3 | mp4”+“| wav | avi | mov | mpeg | ram | m4v | pdf”
+“| rm | smil | wmv | swf | wma | zip | rar | gz))$”;
/*
模式过滤器=Pattern.compile(“(\\(html))”;
*/
公共MyCrawler(){
}
公共布尔值应访问(WebURL){
String href=url.getURL().toLowerCase();
//System.out.println(“Href:+Href”);
/*
if(filters.matcher(href.matches()){
返回false;
}*/
如果(href.startsWith)(“http://www.somehost.com/")) {
返回true;
}
返回false;
}
公众访问(第页){
int docid=page.getWebURL().getDocid();
字符串url=page.getWebURL().getURL();
String text=page.getText();
列表链接=page.getURL();
int parentDocid=page.getWebURL().getParentDocid();
//HttpGet HttpGet=新的HttpGet(url);
试一试{
URL url1=新的URL(URL);
URLConnection=url1.openConnection();
Map responseMap=connection.getHeaderFields();
for(迭代器迭代器=responseMap.keySet().Iterator();迭代器.hasNext();)
{
字符串键=(字符串)迭代器。下一步();
if(key==(“内容类型”)/(此if循环有任何错误)
{
系统输出打印(键+“=”);
列表值=(列表)responseMap.get(键);
对于(int i=0;i
对于字符串比较,请使用.equals()
if (key != null && key.equals("Content-Type"))
键变量包含:
Content-Type=[text/html;charset=ISO-8859-1]
因此不能用=
或.equals(“内容类型”)
如果您尝试运行以下代码,请查看它打印出的内容
URLConnection connection = url1.openConnection();
Map responseMap = connection.getHeaderFields();
Iterator iterator = responseMap.entrySet().iterator();
while (iterator.hasNext())
{
String key = iterator.next().toString();
if (key.contains("Content-Type"))
{
System.out.println(key);
// Content-Type=[text/html; charset=ISO-8859-1]
if (filters.matcher(key) != null){
System.out.println(url1);
// http://google.com
}
}
}
以下是输出:
Content-Type=[text/html; charset=ISO-8859-1]
http://google.com
看起来您也可以只使用一个if语句,如下所示:
while (iterator.hasNext())
{
String key = iterator.next().toString();
if (key.contains("text/html"))
{
System.out.println(url1);
// http://google.com
}
}
顺便说一句,Java中的字符串比较一直让我着迷 也感谢您提供的示例:)如果我想要内容类型不是text/html的URL。那么我们能做什么呢。在这里,我们通过以下if(key.contains(“text/html”))
检查html。如果您想查找html以外的内容,可以编写if(key.contains(“image/png”))。或者使用filters.matcher(键),其中filters包含允许的内容类型