为什么要抓取 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"> <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
...
...
...
...
...
...
...
...
我尝试从 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"> <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 |
... | ... | ... | ... | ... | ... | ... | ... |