我正在尝试使用XPath通过Google Spreadsheet中的importXML从this site获取元素属性的值。
我寻找的属性值content
位于<span>
itemprop="price"
。{/ p>
<div class="left" style="margin-top: 10px;">
<meta itemprop="currency" content="RON">
<span class="pret" itemprop="price" content="698,31 RON">
<p class="pret">Pretul tau:</p>
698,31 RON
</span>
...
</div>
我可以访问<div class="left">
,但我无法访问<span>
元素。
尝试使用:
//span[@class='pret']/@content
我得#N / A; //span[@itemprop='price']/@content
我得#N / A; //div[@class='left']/span[@class='pret' and @itemprop='price']/@content
我得#N / A; //div[@class='left']/span[1]/@content
我得#N / A; //div[@class='left']/span/text()
获取<span>
的文本节点我得#N / A; //div[@class='left']
//
span/text()
我在<span>
中获得div.left
较低的文本节点。要获取<span>
的文本节点,我必须使用//div[@class='left']/text()
。但我不能使用该文本节点,因为如果产品在销售时跨度的布局会发生变化,所以我需要该属性。
这就像我正在寻找的范围不存在,虽然它出现在Chrome的开发视图和页面源中,并且所有XPath都在使用$x("")
的控制台中工作。
我尝试通过右键单击直接从开发工具生成XPath,然后我得到//*[@id='produs']/div[4]/div[4]/div[1]/span
这不起作用。我也尝试用Firefox生成XPath,为FF和Chrome生成插件无济于事。以这些方式生成的XPath甚至无法在我设法用“手动编码的XPath”进行扫描的网站上工作。
现在,最奇怪的是,other site具有明显相似的代码结构,XPath //span[@itemprop='price']/@content
可以正常工作。
我现在挣扎了4天。我开始认为它与自动关闭元标记有关,但为什么不在其他网站上发生这种情况?
答案 0 :(得分:2)
也许以下公式可以帮助您:
=ImportXML("http://...","//div[@class='product-info-price']//div[@class='left']/text()")
或者
=INDEX(ImportXML("http://...","//div[@class='product-info-price']//div[@class='left']"), 1, 2)
<强>更新强>
似乎没有正确解析整个文档,它失败了。文档提取,如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<div class="product-info-price">
<div class="left" style="margin-top: 10px;">
<meta itemprop="currency" content="RON">
<span class="pret" itemprop="price" content="698,31 RON">
<p class="pret">Pretul tau:</p>
698,31 RON
</span>
<div class="resealed-info">
<a href="/resigilate/componente-pc/placi-de-baza/" rel="nofollow">» Vezi 1 resigilat din aceasta categorie</a>
</div>
<ul style="margin-left: auto;margin-right: auto;width: 200px;text-align: center;margin-top: 20px;">
<li style="color: #000000; font-size: 11px;">Rata de la <b>28,18 RON</b> prin <a href="http://www.marketonline.ro/rate-sapte-stele?amount=698.31#brdfinance" title="BRD Finance" target="_blank" class="rate" rel="nofollow">BRD</a></li>
<li style="color: #5F5F5F;text-align: center;">Pretul include TVA</li>
<li style="color: #5F5F5F;">Cod produs: <span style="margin-left: 0;text-align: center;font-weight: bold;" itemprop="identifier" content="mol:GA-Z87X-UD3H">GA-Z87X-UD3H</span> </li>
</ul>
</div>
<div class="right" style="height: 103px;line-height: 103px;">
<form action="/?a=shopping&sa=addtocart" method="post" id="add_to_cart_form">
<input type="hidden" name="product-183641" value="on"/>
<a href="/adaugaincos-183641" rel="nofollow"><img src="/templates/marketonline/images/pag-prod/buton_cumpara.jpg"/></a>
</form>
</div>
</div>
</html>
使用以下XPath查询:
"//div[@class='product-info-price']//div[@class='left']//span[@itemprop='price']/@content"
<强>更新强>
我觉得有一个选择是您可以使用Apps Script创建自己的ImportXML函数,例如:
/* CODE FOR DEMONSTRATION PURPOSES */
function MyImportXML(url) {
var found, html, content = '';
var response = UrlFetchApp.fetch(url);
if (response) {
html = response.getContentText();
if (html) content = html.match(/<span class="pret" itemprop="price" content="(.*)">/gi)[0].match(/content="(.*)"/i)[1];
}
return content;
}
然后您可以使用如下:
=MyImportXML("http://...")
答案 1 :(得分:1)
目前,第一个链接中的referred web page不包含带有itemprop =“price”的span标记,但以下XPath返回639
//b[@itemprop='price']
在我看来问题是元标记不符合XHTML,但现在所有元标记都已正确关闭。
在:
<meta itemprop="currency" content="RON">
现在
<meta itemprop="priceCurrency" content="RON" />
对于不符合XHTML标准的网页,应使用另一种解决方案,而不是IMPORTXML,例如使用IMPORTDATA和REGEXEXTRACT或Google Apps脚本,UrlFetch服务和匹配JavasScript功能,以及其他替代方案。
答案 2 :(得分:0)
尝试这样的smth:
print 'content by key',tree.xpath('//*[@itemprop="price"]')[0].get('content')
或
nodes = tree.xpath('//div/meta/span')
for node in nodes:
print 'content =',node.get('content')
但我没试过。