在python中使用Selenium进行抓取时,只能获得表中的第一行

时间:2017-01-30 17:28:46

标签: python selenium xpath

我正试图从BGG抓取排名数据。

HTML的基本结构如下:

func tabBarBadgeUpdater() {

    for viewController in (self.tabBarController?.viewControllers)! {

        let overdue = self.fetchedResultsController.fetchedObjects?.filter({ (record) -> Bool in
            return (record.date?.compare(Date()) != .orderedDescending)
        })

        print(overdue!.count)

        if viewController.tabBarItem.tag == 1 {

            if overdue!.count != 0 {
                DispatchQueue.main.async(execute: {
                    viewController.tabBarItem.badgeValue = "\(overdue!.count)"
                    viewController.tabBarItem.badgeColor = UIColor.init(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0)
                    self.tableView.reloadData()
                })
            } else {
                DispatchQueue.main.async(execute: {
                    viewController.tabBarItem.badgeValue = ""
                    viewController.tabBarItem.badgeColor = .clear
                    self.tableView.reloadData()
                })
            }
        }
    }
}

请注意,除第一行(标题)之外的每一行都具有相同的ID,并且没有额外数据将其标记为唯一行。

我的(当前)代码如下:

TabBarItem

我也尝试使用

进行迭代
badgeValue

问题是,无论我怎样尝试,我总是只打印出第一行。只是一排又一排地

<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>

1 个答案:

答案 0 :(得分:0)

问题出在您的XPath:您需要将点添加为.//,以指向您要应用XPath而非仅//的确切上下文<html>上的点数。所以试试

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")