2016-08-14 6 views
1

pythonで特定の番号を印刷するlxmlのを取得しよう: http://imgur.com/a/joeqlは、私はpythonで選択した印刷するlxmlのを取得しようとしている

私が持っているコードはあまりないですが、ここでは

from lxml import html 
import requests 


page = requests.get('https://www.pathofexile.com/forum/view-thread/1703834') 
tree = html.fromstring(page.content) 

winner = tree.xpath(//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]) 

print,winner 
です
+0

具体的にどのような遭遇しているエラーですか?言い換えれば、あなたの期待している結果は何ですか?その結果、あなたは代わりに何を得ていますか? – rdgd

+0

私が得意なのは、 winner = tree.xpath(// * @ id = "eventView0"]/div [3]/table/tbody/tr [1]/td [7]) ^ SyntaxError:構文が正しくありません しかし、私は問題について正しく行っているかどうかもわかりません。 –

答えて

1

ご覧の構文エラーは、あなたが引用符にXPath文字列を同封していないので、それを修正です:

winner = tree.xpath('//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]') 

実際問題はテーブルの内容を動的に形成されていることである経由ブラウザで実行されるJavaScript。あなたにできることは、JSONオブジェクト内の所望のデータを持っているscriptタグを解析JSON文字列を抽出し、json.loads()経由でPythonのデータ構造にロードすることです:

import json 
import re 

from lxml import html 
import requests 


page = requests.get('https://www.pathofexile.com/forum/view-thread/1703834') 
tree = html.fromstring(page.content) 

script = tree.xpath('//script[contains(., "var json")]/text()')[0] 
obj_string = re.search(r"var json = (\{.*?\}),$", script, re.MULTILINE).group(1) 
obj = json.loads(obj_string) 

# print entries 
entries = obj['ladder']['entries'] 
for entry in entries: 
    print(entry['account']['name']) 

プリントだけの証拠として(アカウント名それは働いています):

Havoc6 
Steelmage 
Olecgolec 
... 
Anafobia 
nokieka2 
HoGji 
+0

これはうまくいきました!残念なことに私は「15人未満の人がいる」ので、あなたは私のアップフォートを見ることができません! –

+0

私はあなたのためにupvoted AveryLipsitこれは質問への受け入れられた答えでなければなりません。 @alecxe、構文エラーに関して私の答えを含めるように答えを編集してください。同様の問題に対する答えを探している人は完全な答えを見つけるでしょうか? – rdgd

+0

おかげでrdgd、私はちょうど今の答えを受け入れた! –

1

構文エラーは、あなたが無効なpythonを書いていることを意味し、必ずしもロジック/アプローチに問題があるとは限りません。

引数は、tree.xpathの呼び出しの中に、一重引用符で囲んでください。

winner = tree.xpath('//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]') 
+0

ありがとう、今、エラーが消えてもまだ何も印刷されていません。 「プロセスは終了コード0で終了しました」と表示されます –

関連する問題