为什么要抓取 ab table 的 Selenium xpath 不匹配,尽管给定的属性是唯一的

Why the Selenium xpath to scrape ab table is NOT matching, although an attribute is unique given

我尝试从 www.n-tv.de 网站上抓取纳斯达克指数。 我正在通过网站使用 SELENIUM 进行爬网。 股票价值在 Table 秒后显示在网站上。

示例 Table 的源代码如下:

<div class="tableholder">
  <table class="cnttable zebra to le">
    <thead>
      <tr>
        <th>Name</th><th class="ri">Kurs</th><th class="ri">%</th><th class="ri">Absolut</th><th class="ri hidden-xs-down">Relation</th><th class="ri hidden-xs-down">Zeit</th><th class="ri hidden-xs-down hidden-sm-down">Handelsvolumen</th><th class="hidden-xs-down hidden-sm-down">ISIN</th>
      </tr>
    </thead>
    <tbody>
      
      <tr class="linked" onclick="document.location='https://www.n-tv.de/boersenkurse/aktien/activision-blizzard-295693';">
        <td>Activision Blizzard</td>
        <td class="ri"><span class="icon_neg">66,53$</span></td>
        <td class="ri"><span class="neg">-1,42%</span></td>
        <td class="ri"><span class="neg">-0,96</span></td>
        <td class="relation hidden-xs-down"><span class="neg">&nbsp;<span><span></span></span><span style="border-width: 24px;"></span></span></td>
        <td class="ri hidden-xs-down">31.12.</td>
        <td class="ri hidden-xs-down hidden-sm-down">8 Tsd.</td>
        <td class="hidden-xs-down hidden-sm-down">US00507V1098</td>
      </tr>
  
      
      ...
  
    </tbody>
  </table>
</div>

所以我不明白以下问题:

搜索 NASDAQ 的 Web 元素 table 我将按照 Xpath 进行操作:

nasdaq = driver.find_element_by_xpath('//table[@class="cnttable zebra to le"]')
       
rows_nasdaq = nasdaq.find_elements_by_class_name('linked')

我已经做了另一个解决方案,通过搜索 tableholder 元素(本网站上有 3 个)并在列出它们之后只取第三个对象,它可以正常工作,但我真的很想了解,为什么上面的 xpath 选择器对这个元素不起作用,虽然我在这个网站上有唯一的 class 名称作为 table 标签元素的属性。

我不使用 css 之类的东西,有人知道为什么在这种情况下 xpath 不匹配吗??

假设你喜欢刮这个 url https://www.n-tv.de/boersenkurse/suche/?suchbegriff=to%20le.

您必须等待您尝试查找的元素出现在 DOM 中,并且可以使用 selenium waits 为此:

nasdaq = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//table[@class="cnttable zebra to le"]')))

需要导入

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

示例:

....
driver.get('https://www.n-tv.de/boersenkurse/suche/?suchbegriff=to%20le')
nasdaq = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//table[@class="cnttable zebra to le"]')))

for i in nasdaq.find_elements_by_class_name('linked'):
    print(i.get_attribute('onclick'))

输出

document.location='https://www.n-tv.de/boersenkurse/indizes/swx-sp-tra-leis-tr-303397';
document.location='https://www.n-tv.de/boersenkurse/aktien/apollo-tourism-+-leisure-1562996';
document.location='https://www.n-tv.de/boersenkurse/aktien/toqublanmonde--eo-047-11904326';
document.location='https://www.n-tv.de/boersenkurse/indizes/cb-p2p-onl-lend---digbanking-12533785';
document.location='https://www.n-tv.de/boersenkurse/indizes/concinngenddivwomin-leader-3254557';
document.location='https://www.n-tv.de/boersenkurse/indizes/concinnity-msos-leaders-39076931';
...

编辑

根据您的评论,我收到了“link”- 问题,url https://www.n-tv.de/ but the nasdaq is linked by https://www.n-tv.de/boersenkurse/indizes/nasdaq-849974 下没有 table,我在那里找到了您的 table.

所以等待是没有必要的,但也伤不起。我已经将 table 和 pandas 直接导入数据框:

import pandas as pd
...
driver.get('https://www.n-tv.de/boersenkurse/indizes/nasdaq-849974')
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//table[@class="cnttable zebra to le"]')))

pd.read_html(driver.page_source)[3]

输出

注意: Relation 列是空的,因为其中没有存储文本,如果你愿意,你可以简单地删除它

Name Kurs % Absolut Relation Zeit Handelsvolumen ISIN
Activision Blizzard 67,12$ -0,44% -30 nan 18:05 4 Mio. US00507V1098
Adobe 545,25$ -3,39% -1912 nan 18:05 2 Mio. US00724F1012
Advanced Micro Devices 141,89$ -5,55% -834 nan 18:05 44 Mio. US0079031078
Airbnb 167,86$ -2,79% -481 nan 18:05 2 Mio. US0090661010
Align Technology 629,44$ -2,87% -1861 nan 18:02 178 Tsd. US0162551016
... ... ... ... ... ... ... ...