像XPHpple一样的Android XPath HTML解析(我有一个10行的Obj-C实现工作,无法翻译)

时间:2017-07-09 12:36:22

标签: android xml xpath html-parsing

2天前,我编写了这个Objective-c代码,用于从网站中提取完全符合预期的文本。现在我不知道如何为Android实现这一点。对于Android来说,这真的很奇怪,

  • 每个人发布的一些XPath代码与HTML文件不兼容(只接受标准XML)
  • JSoup(可以处理HTML)不能进入Xpath
  • 总而言之,我现在正在走路。

基本上,我需要的是从特定URL的html文件中获取//h2/a周围的元素。 请查看我编写的obj-c实现,它实际上是10行代码,但我无法找到在Android中执行相同操作的方法。

-(void)loadTutorials:(NSString*)startURLS {

NSURL *tutorialsUrl = [NSURL URLWithString:startURLS];
NSData *tutorialsHtmlData = [NSData dataWithContentsOfURL:tutorialsUrl];
TFHpple *tutorialsParser = [TFHpple hppleWithHTMLData:tutorialsHtmlData];

NSString *tutorialsXpathQueryString = @"//h2/a";
NSArray *tutorialsNodes = [tutorialsParser searchWithXPathQuery:tutorialsXpathQueryString];

NSString *podcastTitles[99];

int jjj=0;
for (NSString *string in tutorialsNodes) {
    podcastTitles[jjj]=[[[tutorialsNodes[jjj] firstChild] content] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSLog(@"%@",podcastTitles[jjj]); //WORKING PERFECTLY FINE
    jjj++;
    }
}

1 个答案:

答案 0 :(得分:0)

有了它的工作,关键是要坚持使用XPathFactory但是要为它提供一个HTMLCleaner - 已清理的HTML。不幸的是,我无法找到让我走上正轨的SO答案,所以今天没有信用,但希望我能再次遇到它。

Idk这些行中有多少是必需的,我不会清理这段代码,但这个块现在适用于我。

HtmlCleaner cleaner = new HtmlCleaner();
                CleanerProperties props = cleaner.getProperties();
                props.setAllowHtmlInsideAttributes(true);
                props.setAllowMultiWordAttributes(true);
                props.setRecognizeUnicodeChars(true);
                props.setOmitComments(true);


                TagNode tagNode = new HtmlCleaner().clean(
                        websiteContent);
                org.w3c.dom.Document doc = new DomSerializer(
                        new CleanerProperties()).createDOM(tagNode);

                XPath xpath = XPathFactory.newInstance().newXPath();
                NodeList titleNodes = (NodeList) xpath.evaluate("//h2/a",
                        doc, XPathConstants.NODESET);
                System.out.println("iii"+titleNodes);

                for(int i=0; i<titleNodes.getLength();i++){
                    System.out.println("t t t"+titleNodes.item(i).getTextContent()); //WORKING
                }