gpt4 book ai didi

java - XPath:帮助定位使用 HTMLUnit 抓取的 DOM 中的特定元素

转载 作者:行者123 更新时间:2023-11-30 03:56:53 24 4
gpt4 key购买 nike

我正在使用 HTMLUnit 抓取网页,并从该网页收集了 DOM 节点列表。

在每个“公司”DOM 节点中都有一些我想要抓取的数据。例如,我想要来自此节点内部的电话号码文本:

现在,该元素将是 div 元素的子元素,而 div 元素又是公司节点内另一个 div 元素的子元素。访问它的正确 XPath 行是什么?这是我最近的尝试,但没有返回任何结果。

 List<DomNode> companies = (List<DomNode>) page.getByXPath("//li[@class='featured block twoblock    boxshadow']");
for (int j = 0; j < companies.size(); j++) {

DomNode company = companies.get(j);

// retrieve telephone number
DomNode telephone = (DomNode) company.getByXPath(
"//li[@data-pvd-p='"+j+1+"']/div[@class='listingWrapper']/div[@class='itemInfo']/span[@class='tel']").get(0);

}

这是一个 HTML 示例,内容如下:

        <li class="featured block twoblock boxshadow" data-pvd-p="3" data-pvd-c="0046176330000011028" data-pvd-et="sv" data-pvd-l="true">

<div class="listingWrapper" itemtype="http://schema.org/LocalBusiness" itemscope="">
<a href="/Craddock-Electrical-Services-Ltd/0046176330000011028/"></a>
<div class="itemInfo">
<div class="tradeImage" itemprop="member" itemscope="" itemtype="http://schema.org/Organization"></div>
<h2>
<a itemprop="name" href="/Craddock-Electrical-Services-Ltd/0046176330000011028/"></a>
</h2>
<span class="tel" itemprop="telephone"></span>
<div class="listLinks"></div>
<div id="addressBar"></div>
</div>
<div class="itemInfo2"></div>
<div class="clearLeft"></div>
<ul class="features"></ul>
<div class="clearLeft"></div>
<p class="promo" itemprop="description"></p>
</div>
</li>

更新2:

这是我的 XPath 代码的当前状态。

List<DomNode> companies = (List<DomNode>) page
.getByXPath("//li[contains(@class, 'featured block')]");
for (int j = 0; j < companies.size(); j++) {

String url = "";
DomNode company = companies.get(j);
DomElement web = null;

// retrieve name
DomNode name = (DomNode) company.getByXPath("//a[@itemprop='name']").get(j);

if (companiesLogged.contains(name.getTextContent().trim()) != true) {
companiesLogged.add(name.getTextContent().trim());

// retrieve telephone number
DomNode telephone = (DomNode) company.getByXPath("div[@class='listingWrapper']/div[@class='itemInfo']/span[@class='tel']").get(0);


// retrieve website
try{
web = (DomElement) company.getByXPath("div[@class='listingWrapper']/div[@class='itemInfo']" +
"/div[@class='listLinks']/a[@id='linkWebsite']").get(0);
} catch(IndexOutOfBoundsException e){
System.out.print(" (No Website) ");
}

try{
url = web.getAttribute("href");
} catch (IndexOutOfBoundsException e){
url = "N/A";
}

System.out.println(name.getTextContent().trim() + " "
+ telephone.getTextContent().trim()
+" "+url.trim());

} else {
System.out.println("Company already logged");
}
}

最佳答案

我看到的第一件事是你如何检索 <li> 组节点。只是看看你的@class属性,您无法真正判断“featured block twoblock boxshadow ”中有多少个空格,但 XPath 仅当完全等于时才会返回结果。在这方面,尝试使用更灵活的东西,例如 contains() ,即//li[contains(@class, 'featured block')] .

在没有看到您的目标来源的情况下,我无法提供更多建议,但会在将其添加到问题时更新答案。

我已经在给定的代码片段上尝试了您的 XPath(只是/div 部分,因为这是提供的)并返回 <span class="tel" itemprop="telephone"/>因此。您检索 <li> 的方式似乎存在问题公司节点。

更新 2:从更新的 XML 片段中,您的第一个 XPath //li[@class='featured block twoblock boxshadow']"看起来与父项 <li> 不匹配节点,基于我之前提到的空格。其次,如果确实如此,您正在检查 <li>节点的属性在单独的查询中两次,并假设您给出的索引 data-pvd-p值(在代码片段中从 3 开始)将始终与列表索引(从 0 开始,添加 +1)匹配。我建议删除这部分//li[@data-pvd-p='"+j+1+"']并从 //div 开始。

所以像这样:

List<DomNode> companies = (List<DomNode>) page.getByXPath("//li[contains(@class, 'featured block']");
for (DomNode node : companies) {

// retrieve telephone number
DomNode telephone = (DomNode) node.getByXPath(
"div[@class='listingWrapper']/div[@class='itemInfo']/span[@class='tel']").get(0);

关于java - XPath:帮助定位使用 HTMLUnit 抓取的 DOM 中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22939721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com