2016-02-18 71 views
1

是否有优化的代码的有效方式,因为它的大部分看起来像相同的,我刚开始学习jsoup和不知道如何真正能做到这一点://的Java代码优化(jsoup)

Document doc = Jsoup.connect("http://www.blocket.se/hela_sverige/bilar?ca=11&cg=1020&w=3&md=th").get(); 

Elements partOne = doc.select("a[title=Flera bilder]"); 
for (Element element : partOne) { 
    String myElementOne = element.attr("abs:href"); 
    System.out.println(myElementOne); 

} 
Elements partTwo = doc.select("a[title=\"\"]"); 
for (Element element : partTwo) { 
    String myElementTwo = element.attr("abs:href"); 
    System.out.println(myElementTwo); 

} 
Elements partThree = doc.select("a[title=Bild]"); 
for (Element element : partThree) { 
    String myElementThree = element.attr("abs:href"); 
    System.out.println(myElementThree); 

} 
+2

为什么不写的元素作为参数的函数吗? –

回答

1

partOnepartTwopartThree块是基本相同;只是变量替换所有的参数差异,并解压缩到一个方法:

void someMethodName(Document doc, String selector) { 
    Elements partOne = doc.select(selector); 
    for (Element element : partOne) { 
    String myElementOne = element.attr("abs:href"); 
    System.out.println(myElementOne); 
    } 
} 

实例调用:

someMethodName(doc, "a[title=Flera bilder]"); 

或者,如果你有机会到番石榴:

Iterable<Element> it = Iterables.concat(
    doc.select("a[title=Flera bilder]"), 
    doc.select("a[title=\"\"]"), 
    doc.select("a[title=Bild]")); 
for (Element element : it) { 
    String myElement = element.attr("abs:href"); 
    System.out.println(myElement); 
} 
1

Andy's solution是当然在做这项工作。但是,由于您特别要求优化JSoup调用的方式,因此我建议您了解有关CSS selectorsregular expressions的更多信息。例如,这会在你的情况做精:

Elements allParts = doc.select("a[title~=^Flera bilder$|^$|^Bild$]"); 
for (Element element : allParts) { 
    String elStr = element.attr("abs:href"); 
    System.out.println(elStr); 
} 

在这里,我用的是~=运营商属性的文本。它允许我使用通用正则表达式将所有三个选择语句合并为一个。

这样做将是使用,运营商将所有选择到一个的一种替代方法:

Elements allParts2 = doc.select("a[title=Flera bilder],a[title=\"\"],a[title=Bild]"); 
+0

非常感谢,这是我对CSS选择器不熟悉的问题之一,说实话,我不知道我可以用“,”来区分它们。 – imoteb

+1

没问题。我们每天都在学习新事物!在这个平台上表达感谢的一种好方法是提高答案的答案。所以我会建议你最后一票Andy和我的回答你的问题。 – luksch

+0

是的!只要我获得15的声望,我会做到这一点,不允许现在投票:) – imoteb