dom - 如何从 URL 中提取网页的相对 Xpath
问题描述
我正在开发一个程序来列出网页内的元素及其相应的相对 xpath。使用 Java 和 JSoup,我想提取为任何给定网页中的所有元素动态创建的相对 Xpath。一个完整而小型的工作实用程序肯定会在这里帮助我。
我想要类似的东西:
//*[@id="menu-item-13686"]/a
样本输出:
Element Or Node or component Name: xxxx AND Xpath = //*[@id="menu-item-13686"]/a
谢谢
解决方案
我想你可以从这个开始。
问题已在 jOOX 版本中得到修复 - 1.6.1 使用 Java 10 编译
下面的代码片段选择所有元素,并为每个元素打印出节点名称、标签名称和 CSS 选择器以及将唯一选择该元素的 Xpath。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.joox.selector.CSS2XPath;
public class TestParser {
public static void main(String[] args) {
try {
Document doc = Jsoup.connect("https://theuserisdrunk.com/").get();
Elements elements = doc.select("*");
for (Element element : elements) {
String path = CSS2XPath.css2xpath(element.cssSelector(), true);
System.out.println("Node name : " + element.nodeName());
System.out.println(" Tag : " + element.tagName());
System.out.println(" CSS : " + element.cssSelector());
System.out.println(" XPath : " + path + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
样本输出:
Node name : div
Tag : div
CSS : #mc-embedded-subscribe-form > div.clear:nth-child(4)
XPath : //*[@id='mc-embedded-subscribe-form']/div[@class='clear' or starts-with(@class, 'clear ') or ' clear' = substring(@class, string-length(@class) - string-length(' clear') + 1) or contains(@class, ' clear ')][count(preceding-sibling::*) = 4 - 1]
Node name : input
Tag : input
CSS : #mc-embedded-subscribe
XPath : //*[@id='mc-embedded-subscribe']
Node name : p
Tag : p
CSS : #mc_embed_signup > p.intern:nth-child(2)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 2 - 1]
Node name : a
Tag : a
CSS : #mc_embed_signup > p.intern:nth-child(2) > a
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 2 - 1]/a
Node name : p
Tag : p
CSS : #mc_embed_signup > p.intern:nth-child(3)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 3 - 1]
Node name : i
Tag : i
CSS : #mc_embed_signup > p.intern:nth-child(3) > i
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 3 - 1]/i
Node name : p
Tag : p
CSS : #mc_embed_signup > p.intern:nth-child(4)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]
Node name : a
Tag : a
CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(1)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 1 - 1]
Node name : a
Tag : a
CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(2)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 2 - 1]
Node name : i
Tag : i
CSS : #mc_embed_signup > p.intern:nth-child(4) > i
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/i
Node name : a
Tag : a
CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(4)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 4 - 1]
Node name : a
Tag : a
CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(5)
XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 5 - 1]
Node name : script
Tag : script
CSS : html > body > script:nth-child(3)
XPath : //html/body/script[count(preceding-sibling::*) = 3 - 1]
Node name : script
Tag : script
CSS : html > body > script:nth-child(4)
XPath : //html/body/script[count(preceding-sibling::*) = 4 - 1]
推荐阅读
- codeception - Codeception mock,如何提供方法参数列表
- android - Kotlin 中的 ServerValue.TIMESTAMP 火库
- excel - Excel VBA获取时差
- compare - Amazon Rekognition 比较照片访问被拒绝异常
- tensorflow - 在带有 GPU 的 armv8 设备上运行我的 tensorflow 代码后崩溃
- phpstorm - WebStorm - 在“到处搜索”(双班)中点击返回/输入不会打开选定的文件
- python - PyQt5 - 如何识别按下了哪个按钮
- c# - WPF - 如何防止 DataTemplate 中的 AutomationId 重复
- angular - Object.keys(object).map() 不返回键
- javascript - NuxtJS| 在头组件中加载组件