Вы можете выбрать объединение двух взаимоисключающих выражений (обратите внимание на оператор объединения |
):
//table[@class='StandardTable']/tbody/tr[position()>1]/td[2]/a/img|
//table[@class='StandardTable']/tbody/tr[position()>1]/td[2][not(a/img)]
Когда первое выражение возвращает узлы, второе не будет (и наоборот)), что означает, что вы всегда получите только необходимые узлы.
Из ваших комментариев к ответу @ Dimitre я вижу, что HTMLCleaner не полностью поддерживает XPath 1.0.Тебе это не нужно.Вам просто нужен HTMLCleaner для разбора ввода, которое не правильно сформировано.Как только он выполнит эту работу, преобразуйте его вывод в стандартный org.w3c.dom.Document
и обработайте его как XML.
Вот пример преобразования:
TagNode tagNode = new HtmlCleaner().clean("<html><div><p>test");
Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);
С этого момента, просто используйте JAXP с любой реализацией, которую вы хотите:
XPath xpath = XPathFactory.newInstance().newXPath();
Node node = (Node) xpath.evaluate("/html/body/div/p[not(child::*)]",
doc, XPathConstants.NODE);
System.out.println(node.getTextContent());
Вывод:
test