- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
htmlunit 报告从 css 到页面上解析错误的所有内容。 这个怎么静音?? 最佳答案 把这些放在声明 webClient 之后 webClient.setCssError
可能显示 Javascript 测试支持 package htmlunitpoc; import com.gargoylesoftware.htmlunit.WebClient; import co
我正在尝试使用 HtmlUnit 登录到我的本地 wordpress 网站,但它似乎存在 cookie 问题。 那是代码的开头: WebClient webClient = new WebClient
有什么办法可以在 HtmlUnit 中使用 session 更改 url? 我的情况如下所示, 登录 http://test.raja.com与凭据。 获取页面http://home.raja.com
我有以下代码: WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("http://www.myland.
我研究过htmlunit、httpunit、jwebunit、selenium等ui测试工具。 我对测试工具不是很熟悉。 Htmlunit 在 javascript 支持方面听起来是个不错的选择。然后
我拥有的页面对象是 click() 长链的结果调用(以防万一您想知道如何在不知道用于获取它的 URL 的情况下拥有一个页面对象)。 方法HtmlPage.getDocumentURI未实现。 Html
这是我要抓取的页面:https://www.tokopedia.com/berkahcell2/promo-termurah-vr-virtual-reality-box-v-2-0-remote-b
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我的站点结构看起来像这样: Item 1 Desc 1
我的代码是这样的: WebClient webClient = new WebClient(BrowserVersion.CHROME); webClient.setAjaxController(ne
我只希望页面的文本内容,并且希望抓取尽可能轻巧。我可以关闭HTMLUnit开箱即用的所有JavaScript和CSS以及其他外部内容的解析和其他加载功能吗? 最佳答案 我认为与您正在寻找的最接近的东西
我有一个提交按钮,但无法点击.. Send SMS 我已经尝试过这个: page = (HtmlPage) form.getInputByValue("Send SMS").click()
我使用 HtmlUnit 对我的网站进行自动化测试。我的网站使用 gmaps api - 发送外部网站请求需要花费大量时间(我有数百次测试和数千次页面加载)。 我需要一些方法来告诉 HtmlUnit
我使用 HtmlUnit 对我的网站进行自动化测试。我的网站使用 gmaps api - 发送外部网站请求需要花费大量时间(我有数百次测试和数千次页面加载)。 我需要一些方法来告诉 HtmlUnit
我正在使用 HtmlUnit 加载一个充满 JavaScript 的网页。 WebClient 可以很好地执行 JavaScript。 但是,当我单击调用 Ajax 调用的特定表单上的按钮时,即使调用
我正在尝试使用 HtmlUnit 登录 Facebook 页面并查看其 HTML 内容。我正在尝试通过 HtmlUnit 填写登录凭据,但在单击提交按钮时我没有看到正在执行的 session 。 在
Hy...我想使用 HtmlUnit 登录到一些 3rd 方网站。但是 HtmlUnit 应该能够告诉我对输入站点的登录尝试是否成功。有什么办法可以使用 HtmlUnit 执行此任务。请帮忙 ..!!
我正在从 selenium-1 升级到 selenium-2 并尝试新的 HtmlUnit 驱动程序。我已经尝试了一些基本的测试(打开一个页面,get_text,..),它似乎 极慢(我认为 chro
我正在使用 HTMLUnit。我正在访问页面,但是特殊(马耳他)字符显示错误。例如,ġuvni 显示为 ?uvni HtmlPage page = submit_button.click(); Sys
我是一名优秀的程序员,十分优秀!