0

XPath を使用して Google スプレッドシートの importXML を介して、このサイトから要素属性の値を取得しようとしています。

私が求める属性値content<span>with にありitemprop="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>

アクセスできます<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>i get #N/A;のテキスト ノードを取得します。
  • //div[@class='left']//span/text()<span>下のテキストノードを取得しますdiv.left

<span>iのテキスト ノードを取得するには、を使用する必要があります//div[@class='left']/text()。しかし、商品がセール中の場合、スパンのレイアウトが変わるため、そのテキスト ノードを使用できないため、属性が必要です。

探しているスパンが存在しないようですが、Chrome の開発ビューとページ ソースに表示され、すべての XPath は を使用してコンソールで動作し$x("")ます。

右クリックして開発ツールから XPath を直接生成しようとしましたが、//*[@id='produs']/div[4]/div[4]/div[1]/spanどれが機能しませんか。また、Firefox と FF および Chrome のプラグインを使用して XPath を生成しようとしましたが、役に立ちませんでした。これらの方法で生成された XPath は、「ハンドコーディングされた XPath」でスクレイピングできたサイトでも機能しませんでした。

さて、最も奇妙なことは、明らかに類似したコード構造を持つこの別のサイトで XPath//span[@itemprop='price']/@contentが機能することです。

私はこれで4日間苦労しました。メタタグのオートクローズが関係しているのではないかと思い始めたのですが、なぜ他のサイトでは起こらないのでしょうか?

4

3 に答える 3

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 関数を作成するという選択肢が 1 つあります。

/* 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://...")
于 2013-10-27T08:57:13.360 に答える
0

次のように試してみてください:

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')

しかし、私はそれを試していません。

于 2013-10-28T10:09:21.637 に答える