2016-11-27 16 views
0

最初にオフにすると、タイトルがあまり明確でない場合はごめんなさい。私はタイトルで何をしたいのかを説明する方法についてはあまりよく分かりません。とにかくPython xpath - 正しい順序で情報を取得

ウェブサイトから情報を取得しています。私はすでに私が欲しい情報を持っているが、私は、スクリプトを実行すると、以下のように、私は出力を得る:

Ivern Jungle 
Starting Items             
Hunter's Talisman 
Refillable Potion 
Warding Totem 
First Goal              


Stalker's Blade 
Tracker's Knife 
Boots of Speed 
Hunter's Potion 
Vision Ward 
Sweeping Lens 
Second Goal 

私はそれはこのようになりたいときは:

Ivern Jungle 

Starting Items             
Hunter's Talisman 
Refillable Potion 
Warding Totem 


First Goal        
Stalker's Blade 
Tracker's Knife 
Boots of Speed 
Hunter's Potion 
Vision Ward 
Sweeping Lens 
Second Goal 

私はいくつかのことを試してみましたコードで。これが私が望むように働くことができる唯一の方法です。 Ivern jungleはタイトルです。 Starting Itemsは別のタイトルであり、First Goal別のタイトルです。私が最初にタイトルを取得してから、他の情報(アイテム)を取得する前に。これは私が今持っているコードです。

 for build_names in guide_page.xpath(".//div[@class='build-container box-shadow-lb']" 
              "/div[1]/div[1]/div[1]/div[1]/div[1]"): 

      for title in build_names.xpath("div[1]/h2/text() | div[3]/div[1]/div/h2/text() | " 
              "div[3]/div[1]/div/div/div/a/div[2]/span/text()"): 
       print(title) 

それは私がそれを右に得ることができた方法ですので、私は、forループをtitleからの情報のほとんどを取得しています。より効率的な方法があれば、私はところで

を教えてください、その情報は、特定のウェブサイトからですが、ウェブサイトでは、私はこのような情報を入手する別の特定のWebサイトから、変更することができます:あなたは私が得ることはありません見ることができるように

Kled The Talker # Title 
Kled Tank/Ad Top # Title            
Mercury's Treads 
The Black Cleaver 
Titanic Hydra 
Frozen Mallet 
Dead Man's Plate 
Guardian Angel 
Kled Ad/LifeSteal # Title            
Mercury's Treads 
The Black Cleaver 
Ravenous Hydra 
Death's Dance 
Maw of Malmortius 
Guardian Angel 

間にあるスペース。 first websiteに行くと、アイテムセクションにアイテムセクションの各タイトルの右側にメモがあることがわかります。私はそれらがsecond websiteにメモがないので、出力にスペースを入れるものだと思う。まあ、それは私の主な問題です。どのように出力をフォーマットできますか?私が自分自身をあまりにも明確に説明しなかったなら、私に知らせてください。私は質問を更新します、ありがとう! :)

答えて

1

クラス属性を頻繁に使用することで、ツリーをかなり簡単に操作できます。そうすれば、あなたはこのようなあなたのスクリプトを書き換えることができます:

for div in page.xpath('//div[contains(@class, "item-wrap")]'): 
    print("\n{bar}\n{title}\n{bar}".format(
     bar="#"*20, 
     title=div.xpath('.//h2/text()')[0].strip())) 
    print('\n'.join(x.strip() for x in div.xpath(
     './/div[contains(@class, "main-items")]//span/text()'))) 

出力の抜粋を:

#################### 
Starting Items 
#################### 
Hunter's Talisman 
Refillable Potion 
Warding Totem 

#################### 
First Goal 
#################### 
Stalker's Blade 
Tracker's Knife 
Boots of Speed 
Hunter's Potion 
Vision Ward 
Sweeping Lens 

#################### 
Second Goal 
#################### 
Rod of Ages 
Boots of Mobility 
Ionian Boots of Lucidity 
Boots of Swiftness 
Sorcerer's Shoes 
Oracle Alteration 

これらのXPathは、あなたがにリンクされている2ページ目も同様に動作します。

+0

優秀、ありがとうございました。それはあまりにも多くの質問をしないでください。私が使用していた 'for'の上には、ちょうどコードブロックを表示していた' if'がありました。 htmlには 'style =" display:block; 'または' style = "display:none;' divsがあります。 'style =" display:block; 'を使いたい、あなたは[ここ](http://www.mobafire.com/league-of-legends/build/open-your-eyes-lee-sin-jungle-guide-393845)を見ると、上に2枚の写真があることがわかります"ビルド1"と "ビルド2"のタイトル、 "ビルド1"から情報を取得したいのですがどうすればいいですか?ありがとう – Aguxez

+1

@fuhrerguxezそれは簡単ではありません:これらの属性はjQueryによって動的に追加されます。 "Build 1"は常にHTMLの "Build 2"の前にリストされ、次にpage.xpath( '// div [contains(@class、 "build-container" )]/div ')[0] '。そのノードから後続のxpathsをrebaseする必要があります。 –

+0

申し訳ありません、私はそれを働かせました;私はいくつかのものを変更しました。私は思う、私はそれを徹底的にテストします;あなたの助けの男のために感謝!:) – Aguxez

関連する問題