excel Selenium -文本未从XPath中提取

zsohkypk  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(92)

我写了一些代码来从网页中提取一些统计数据。几乎所有的信息都能通过,但玩家的名字是唯一没有返回的信息。我已经尝试了不同版本的名称(完整的,短的,第一个,最后一个),但似乎没有工作,但。该代码与返回的所有其他信息完全相同。我一直在使用搜索引擎来获取文本,因为我发现网站不时地更改班级名称。这是我的代码:

Set ch = New Selenium.ChromeDriver
ch.AddArgument "--headless"
ch.Get "https://www.euroleaguebasketball.net/eurocup/game-center/2023-24/cedevita-olimpija-ljubljana-joventut-badalona/U2023/12/#boxscore"

Set sht = Sheets("Sheet1")
Rw = 1
Base = "//*[@id='main']/div/div/div[2]/div/div[3]/div/div[2]/div/div[1]/div/div[1]/"
For Rw = 1 To 20
    Exists = ch.FindElementsByXPath(Base & "div[1]/div[" & Rw & "]/span").Count
    
    If Exists > 0 Then
    sht.Cells(Rw, 1) = ch.FindElementByXPath(Base & "div[1]/div[" & Rw & "]/span").Text
    sht.Cells(Rw, 2) = ch.FindElementByXPath(Base & "div[1]/div[" & Rw & "]/a/div[1]").Text
    sht.Cells(Rw, 3) = ch.FindElementByXPath(Base & "div[2]/div[1]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 4) = ch.FindElementByXPath(Base & "div[2]/div[1]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 5) = ch.FindElementByXPath(Base & "div[2]/div[2]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 6) = ch.FindElementByXPath(Base & "div[2]/div[2]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 7) = ch.FindElementByXPath(Base & "div[2]/div[3]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 8) = ch.FindElementByXPath(Base & "div[2]/div[3]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 9) = ch.FindElementByXPath(Base & "div[2]/div[4]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 10) = ch.FindElementByXPath(Base & "div[2]/div[4]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 11) = ch.FindElementByXPath(Base & "div[2]/div[5]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 12) = ch.FindElementByXPath(Base & "div[2]/div[5]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 13) = ch.FindElementByXPath(Base & "div[2]/div[5]/div[" & Rw & "]/div/div[3]").Text
    sht.Cells(Rw, 14) = ch.FindElementByXPath(Base & "div[2]/div[6]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 15) = ch.FindElementByXPath(Base & "div[2]/div[6]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 16) = ch.FindElementByXPath(Base & "div[2]/div[6]/div[" & Rw & "]/div/div[3]").Text
    sht.Cells(Rw, 17) = ch.FindElementByXPath(Base & "div[2]/div[7]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 18) = ch.FindElementByXPath(Base & "div[2]/div[7]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 19) = ch.FindElementByXPath(Base & "div[2]/div[8]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 20) = ch.FindElementByXPath(Base & "div[2]/div[8]/div[" & Rw & "]/div/div[2]").Text
    sht.Cells(Rw, 21) = ch.FindElementByXPath(Base & "div[2]/div[9]/div[" & Rw & "]/div/div[1]").Text
    sht.Cells(Rw, 22) = ch.FindElementByXPath(Base & "div[2]/div[9]/div[" & Rw & "]/div/div[2]").Text

    End If
Next Rw

我得到了这个:

所以数字是拉在(我可以修复格式),但名称只是空白。

b09cbbtk

b09cbbtk1#

首先,不要使用绝对XPATH,它不可能读取你的代码,而且绝对路径很难支持。在XPATH树中改变DOM中的一个元素会破坏定位器。
而不是它,使用缩短的'相对'声明。
Reference
例如,Base变量的唯一定位器为//div[contains(@class, 'is-active')]//*[contains(@class, 'game-box-scores-table-grouped-tab_tableGrouped_')]
很容易找到它-你去你的基本元素,看看它的属性。你会发现它的品位似乎是独一无二的。搜索类game-box-scores-table-grouped-tab_tableGrouped_',得到2个元素。你只需要1。你查看它的父类,你会发现,你的表的父类之一有类is-active,它指向可见表。
我们得到了短而清晰的Base。然后我们寻找球员的名字。检查元素,我们看到它有唯一的类部分playerFullName,它只属于name。
它的XPath定位器是//*[contains(@class, 'playerFullName’)]
所以我们只需要得到元素数组,使用这个选择器,并通过索引(在您的情况下为Rw)获得所需的行

Base = "//div[contains(@class, 'is-active')]//*[contains(@class, 'game-box-scores-table-grouped-tab_tableGrouped_')]/"
For Rw = 1 To 20
    // your code
    sht.Cells(Rw, yourCell) = ch.FindElements(By.XPath(Base & "/*[contains(@class, 'playerFullName’)]"))(Rw).Text

相关问题