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



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++;
}
}

让它工作,关键是坚持使用 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
}

相关内容

最新更新