2017-11-15 14 views
0

私はフォーラムを拝見しており、投稿に関する統計、特に投稿が取得する閲覧数と返信数を取得しようとしています。より洗練されたxpathソリューション?

私はこのようなルックスを解析しています何のためのページのソース:

<ul class="ipsDataItem_stats"> 
<li> 
    <span class="ipsDataItem_stats_number">61</span> 
    <span class="ipsDataItem_stats_type"> replies</span> 
</li> 
<li class="ipsType_light"> 
    <span class="ipsDataItem_stats_number">6,106</span> 
    <span class="ipsDataItem_stats_type"> views</span> 
</li>   

そして、私は一緒に私が探しているものを引っ張り、いくつかのコードをハッキングしてきましたが、私はどのように不思議ですあなたはxpathの専門家がこれを処理していました。

Stats = node.find_elements_by_xpath('.//ul[@class="ipsDataItem_stats"]') 
Replies = (Stats[0].find_elements_by_xpath('.//span[@class="ipsDataItem_stats_number"]'))[0].text 
Views = (Stats[0].find_elements_by_xpath('.//span[@class="ipsDataItem_stats_number"]'))[1].text 

私のソリューションは、特定の順序であることの統計に依存し、同じ結果を達成するために、より正確な方法があります場合、私は思ったんだけど。

例えば擬似コード:

Replies = node.find_elements_by_xpath({get span text where class = "ipsDataItem_stats" and sibling span class = "ipsDataItem_stats_type" and text = "replies"}) 
+0

「より正確」または「よりエレガントな」とはどういう意味ですか?これらのxpath式で何が問題になっていますか? – krokodilko

+0

サイトがページをレンダリングしてli要素を反転させて、ビューが最初で応答が2番目になるとどうなりますか?または、Stats [0]がStats [1]やStats [2]などになる必要があるように、追加の統計情報を追加します。私はより正確に要素を取得する方法を探しています。リスト。 – user3246693

+0

私の擬似コードを見ると、1xpathクエリで返された返信を取得する方法になりますが、そのクエリの構築方法はわかりません。 – user3246693

答えて

0

私はより正確に、リスト内の位置に依存せずに、私は後 午前の要素を取得する方法を探しています。

要素が第1要素のベローズXPath式を使用し、そのクラス名

<span class="ipsDataItem_stats_number">61</span> 
<span class="ipsDataItem_stats_type"> replies</span> 

によって互いに区別することができる。

.//span[ contains(@class, 'stats_number')] 

及び第二要素

.//span[ contains(@class, 'stats_type')] 

このようにしてe式は要素の順序の変更に抵抗します。

+0

class = "stats_number"を含む2つのspan要素があります。リストを返すだけでリストの順序に基づいて値を参照する必要がありますか? – user3246693

+0

はい、一致するすべての要素のリストを返します。個々の要素にアクセスするには、リストを反復処理します。 – krokodilko

+0

.// span [contains(@class、 'stats_number')] < - 値が返されたリストについて、それを反復処理しているので、どの数値を返信と表示するのかを教えてください。その情報は2番目のリストにあるので、私はリストの位置に頼っている元の問題に戻ります。 – user3246693

0

これを2ステップのパイプラインで処理します。最初のステップは、XSLTを使用してよりクリーンなXML形式に変換することです。第2の手順は、クリーンなXMLをクエリします。このフラグメントのためのクリーンアップXMLは次のようになります。

<ipsDataItem_stats> 
    <replies>61</replies> 
    <views>6106</views> 
</ipsDataItem_stats> 

このアプローチの利点は、クリーンアップ相が完全に再利用可能な、あなたが実行したい、実際のクエリの独立していることです。一度書かれると、後続の問合せを非常に簡単に書くことができます。

+0

xsltドキュメントを掘り起こすことを始めましたが、私がオンラインで見つけたほとんどの例は、このライブラリを使用してxmlを生成するためのものです。このライブラリを使用して、このような出力をどのように再フォーマットしますか? – user3246693

+0

オンラインでサンプルを検索してXSLT(または他の言語)を学ばないようにしてください。それは絶望的に非効率な学習戦略です。運転している人のビデオクリップを探して運転することを学びますか?あなた自身に良い本を買って、それを使ってベッドに巻き上げる。 –

0

statを表すラベルを見ることができます。ご注文について何を知っている必要はありません

FirstRecordsRepliesXpath = '//ul[@class="ipsDataItem_stats"][0]//li[contains(., "replies")]/span[@class="ipsDataItem_stats_number"]' 
FirstRecordsViewsXpath = '//ul[@class="ipsDataItem_stats"][0]//li[contains(., "views")]/span[@class="ipsDataItem_stats_number"]' 

この方法:我々は、XPath、次の取得返信やビューの場合

'//ul[@class="ipsDataItem_stats"][<FILL HERE RECORDS POSITION>]//li[contains(., "<FILL HERE RECORDS LABEL>")]/span[@class="ipsDataItem_stats_number"]' 

:一般的なXPathは次のようになります。しかし、あなたはラベルを知る必要があります。これは大丈夫です。

関連する問題