使用ImportXML和Google电子表格中的XPath </span>的Phantom <span>元素

时间:2013-10-27 05:59:07

标签: xpath google-sheets html

我正在尝试使用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天。我开始认为它与自动关闭元标记有关,但为什么不在其他网站上发生这种情况?

3 个答案:

答案 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&amp;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')

但我没试过。