2016-11-19 20 views
0

XPathを使用してhereからデータをスクラップしようとしていますが、パスをコピーして/ text()最後のspanタグの間にあるテキストの代わりに["Class 5"]の代わりに返されています。既に/ text()を使用していますが、Xpathを使用してテキストを取得できません

import requests 
from lxml import html 

sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16") 
tree = html.fromstring(sample_page.content) 
r1class = tree.xpath('//*[@id="resultsListContainer"]/div[3]/table/tbody/tr[1]/td/span[1]/text()') 

print(r1class) 

私が対象としている要素は、レース1(クラス5)のクラスであり、使用しているXPathと一致しています。

+0

// * [ID @ = "resultsListContainer"]/DIV [3] /テーブル// TR [1]/TD /スパン[1] /テキスト() – spinkus

+0

はまだFirebugのを使用して何も – McLeodx

+1

検証を取得して何もないことを証明あなたのXPath式に間違っている、何か他のものでなければなりません。 – Bouke

答えて

1

以下のコードは仕事を行う必要があります。つまり、一致するXPath式を持つ他のサイトを使用しているときに動作します。 racenetサイトでは有効なHTMLが配信されないため、コードが失敗する可能性があります。これは、W3Cオンラインバリデータを用いて検証することができます。https://validator.w3.org

import lxml.html 

html = lxml.html.parse('https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16') 
r1class = html.xpath('//*[@id="resultsListContainer"]/div[3]/table/tbody/tr[1]/td/span[1]/text()')[0] 
print(r1class) 
+0

回避策としては、* requests *ライブラリを使用してHTMLドキュメントを読み取り、HTML宣言を修正し、修正されたHTMLコンテンツを解析することがあります。 – Bouke

+0

いいえ、その回避策はうまくいかなかった... – Bouke

1

これは、あなたが始める必要があります。

import requests 
from lxml.etree import HTML 

sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16").content 
tree = HTML(sample_page) 
races = tree.xpath('//table[@class="tblLatestHorseResults"]') 
for race in races: 
    rows = race.xpath('.//tr') 
    for row in rows: 
     row_text_as_list = [i.xpath('string()').replace(u'\xa0', u'') for i in row.xpath('.//td') if i is not None] 
1

XPath式は、スクラップしようとしているHTMLページが大きく壊れているため、何も一致しません。 FF(または他のウェブブラウザ)は、ページを表示する前にそのページを修正します。これにより、元の文書には存在しないHTMLタグが追加されます。

次のコードにはXPath式が含まれていますが、正しい方向を指している可能性があります。

import requests 
from lxml import html, etree 
sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16") 
tree = html.fromstring(sample_page.content) 
nodes = tree.xpath("//*[@id='resultsListContainer']/div/table[@class='tblLatestHorseResults']/tr[@class='raceDetails']/td/span[1]") 
for node in nodes: 
    print etree.tostring(node) 

実行すると、これは次のように出力されます

$ python test.py 
<span class="bold">Class 5</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 3</span> Track: 
<span class="bold">Class 2</span> Track: 
<span class="bold">Class 3</span> Track: 

ヒント:Webページをこすりしようとしている、そして物事がちょうどにHTMLを予想通り、仕事ダウンロードして保存していない時はいつでもファイル。この場合、例:

f = open("test.xml", 'w') 
f.write(sample_page.content) 

次に、保存されたHTMLを見てください。これにより、DOMの外観を知ることができます。

関連する問題