2017-01-30 5 views
1

にセレンを掻き落としたときに、私はBGGからランクデータをこすりしようとしているテーブル内の最初の行を取得することができます。は唯一のpython

HTMLの基本的な構造は次のようである:

<table class = "collection_table"> 
 
<tbody> 
 
    <tr></tr> 
 
    <tr id="row_"></tr> 
 
    <tr id="row_"></tr> 
 
    <tr id="row_"></tr> 
 
    <tr id="row_"></tr> 
 
    <!--snip--> 
 
    <tr id="row_"></tr> 
 
    <tr id="row_"></tr> 
 
    <tr id="row_"></tr> 
 
</tbody> 
 
</table>

注(ヘッダ)最初除くすべての行が同じIDを有しており、余分なデータとしてマークしないようにすることを一意の行

次のように私の(現在の)コードは次のとおりです。

def bgg_scrape_rank_page(browser, bgg_data): 
    time.sleep(1) 
    table = browser.find_element_by_xpath("//table[@class='collection_table']/tbody") 
    row = table.find_element_by_xpath("//tr[@id='row_']") 
    while row: 
     rank = row.find_element_by_xpath("//td[1]").text 
     game_name = row.find_element_by_xpath("//td[3]/div[2]/a").text 
     game_page = row.find_element_by_xpath("//td[3]/div[2]/a").get_attribute("href") 
     print rank, game_name, game_page 
     row = row.find_element_by_xpath("//following-sibling::tr") 

私も問題は関係なく、私がしようとしているように見えるものを、私はいつものみを取得しない、ある

rows = browser.find_elements_by_xpath("/tr[@id='row_']") 
for row in rows: 
    rank = row.find_element_by_xpath("//td[1]").text 
    game_name = row.find_element_by_xpath("//td[3]/div[2]/a").text 
    game_page = row.find_element_by_xpath("//td[3]/div[2]/a").get_attribute("href") 
    print rank, game_name, game_page 

を使用して反復処理しようとしています最初の行が印刷されます。ただ、

1 "Pandemic Legacy: Season 1 https://boardgamegeek.com/boardgame/161936/pandemic-legacy-season-1". 

答えて

0

の行の後に行の問題は、あなたのXPathである:あなたは、あなただけではなく、//常に<html>にポイントするのXPathを適用する正確な文脈上のポイントに.//としてドットを追加する必要があります。だから、

def bgg_scrape_rank_page(browser, bgg_data): 
time.sleep(1) 
table = browser.find_element_by_xpath("//table[@class='collection_table']/tbody") 
row = table.find_element_by_xpath(".//tr[@id='row_']") 
while row: 
    rank = row.find_element_by_xpath(".//td[1]").text 
    game_name = row.find_element_by_xpath(".//td[3]/div[2]/a").text 
    game_page = row.find_element_by_xpath(".//td[3]/div[2]/a").get_attribute("href") 
    print rank, game_name, game_page 
    row = row.find_element_by_xpath(".//following-sibling::tr") 
+0

感謝をしてみてください!私はまだ、すべての要素が同じであったときに、前にサイズ100の "行"リストを取得していたのですか? – Bill

+0

'XPath'' // tr [@ id = 'row _']'はすべての 'tr'要素を' id = 'row_''でページにマッチさせます。 'id'は一意の識別子でなければならず、単一の要素だけに設定されなければならないので、開発上の問題であるようです。あなたの場合、各要素を識別するためにインデックスを使用する必要があるかもしれません... – Andersson