【问题标题】:Unable to get table element in website using Selenium无法使用 Selenium 在网站中获取表格元素
【发布时间】:2018-03-09 12:23:15
【问题描述】:

下面的网站有几个表格,但我的代码无法获得特定的一个(也没有任何其他表格)。

代码旨在从表格“Ações em Circulação no Mercado”中获取数据 -> 网页中最后一个表格。

我已经尝试了下面的代码和一些替代方案,但没有一个对我有用:

import pandas as pd
from selenium import webdriver
from time import sleep

url = "http://bvmf.bmfbovespa.com.br/cias-Listadas/Empresas-Listadas/BuscaEmpresaListada.aspx?idioma=pt-br"
Ticker='ITUB4'
browser = webdriver.Chrome()
browser.get(url)
sleep(2) #Wait webpage to load
browser.find_element_by_xpath(('//*[@id="ctl00_contentPlaceHolderConteudo_BuscaNomeEmpresa1_txtNomeEmpresa_txtNomeEmpresa_text"]')).send_keys(Ticker)
browser.find_element_by_xpath(('//*[@id="ctl00_contentPlaceHolderConteudo_BuscaNomeEmpresa1_btnBuscar"]')).click();
sleep(2) #Wait webpage to load
browser.find_element_by_xpath(('//*[@id="ctl00_contentPlaceHolderConteudo_BuscaNomeEmpresa1_grdEmpresa_ctl01"]/tbody/tr/td[1]/a')).click();
sleep(5) #Wait webpage to load

#This is not working
content = browser.find_element_by_css_selector('//div[@id="div1"]')

#This is not working as well
#browser.find_element_by_xpath('//*[@id="div1"]/div/div/div[1]/table/tbody/tr[1]/td[1]').text

表格和完整的 HTML 可以在这里找到:

HTML 是:

<div id="div1">
                <div>
                    <h3>Ações em Circulação no Mercado</h3>
                    <div class="table-wrapper"><div class="scrollable"><table class="responsive">

                        <thead>
                            <tr>
                                <th colspan="3" class="text-center">19/04/2017</th>
                            </tr>
                            <tr>
                                <td>Tipos de Investidores / Ações</td>
                                <td class="text-center">Quantidade</td>
                                <td class="text-center">Percentual</td>
                            </tr>
                        </thead>

                            <tbody><tr>
                                <td>Pessoas Físicas</td>
                                <td class="text-right">108.853</td>
                                <td class="text-right"> - </td>
                            </tr>

                            <tr>
                                <td>Pessoas Jurídicas</td>
                                <td class="text-right">11.591</td>
                                <td class="text-right"> - </td>
                            </tr>

                            <tr>
                                <td>Investidores Institucionais</td>
                                <td class="text-right">1.039</td>
                                <td class="text-right"> - </td>
                            </tr>

                            <tr>
                                <td>Quantidade de Ações Ordinárias</td>
                                <td class="text-right">272.710.309</td>
                                <td class="text-right">8,21</td>
                            </tr>

                            <tr>
                                <td>Quantidade de Ações Preferenciais</td>
                                <td class="text-right">3.141.058.175</td>
                                <td class="text-right">97,23</td>
                            </tr>

                            <tr>
                                <td>Total de Ações</td>
                                <td class="text-right">3.413.768.484</td>
                                <td class="text-right">52,11</td>
                            </tr>

                            </tbody></table></div><div class="pinned"></div></div>
                </div>
                </div>

【问题讨论】:

标签: python python-3.x selenium web-scraping


【解决方案1】:

您在 CSS 选择器定义中编写了 XPATH。你应该找到 tables = browser.find_elements_by_css_selector('.responsive') 如果你想要所有表,然后从它们中解析。或者 使用browser.find_element_by_xpath(.//*[@id='div1']/div/table) 定位准确的表格。

【讨论】:

  • 顺便说一句,通过 XPATH 定位到您的元素的正确方法如下:browser.find_element_by_xpath(//div[@id='div1']//table[@class='responsive'])
  • 谢凯伦。您的解决方案对您的补偿有效吗?找到所有表的第一个代码给了我一个空变量,您评论中的解决方案给了我错误消息:NoSuchElementException:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“/ /div[@id='div1']//table[@class='responsive']"} Tks!
【解决方案2】:

您可以进行的一个快速更正是将 content = browser.find_element_by_css_selector('//div[@id="div1"]') 更改为 content = browser.find_element_by_xpath('//div[@id="div1"]'),因为它实际上是您正在使用的 xpath。

第二次尝试失败的原因可能是 div1 元素没有滚动到视图中。 Selenium 不能与不可见的元素很好地相互作用。所以试试这个:

element = browser.find_element_by_xpath('//*[@id="div1"]')
# Force the element to be scrolled into view, even if you don't need its location.
location = element.location_once_scrolled_into_view
# Now Selenium can get its text.
text = element.text

【讨论】:

  • 感谢@Ron Norris。两种解决方案都不起作用。这两种情况的错误消息是: NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="div1"]"} 您的 cmets 非常有趣在滚动视图上。也许错误是因为同一页面内有 2 个卷轴。我会寻找更多关于这方面的信息。谢了!
【解决方案3】:

要定位 WebElement 并提取文本 Pessoas Fisicas,您可以使用以下代码行:

content = driver.find_element_by_xpath("//h3[.,'Ações em Circulação no Mercado']//following::div[1]//table[@class='responsive']//tr//following-sibling::td[1]").get_attribute("innerHTML")

更新(无代码更改)

xpath 表达式:

//h3[.,'Ações em Circulação no Mercado']//following::div[1]//table[@class='responsive']//tr//following-sibling::td[1]

不应在单引号内,例如'xpath_here'。将 xpression with 放在双引号中,例如"xpath_here"

查看工作快照:

【讨论】:

  • 感谢@DebanjanB。你的解决方案对我不起作用。它对你有好处吗?我收到以下错误: InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression //h3[.,'Ações em Circulação no Mercado']//following::div[1]//table[@class= 'responsive']//tr//following-sibling::td[1] 因为以下错误:SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//h3[.,'Ações em Circulação no Mercado']//following::div[1]//table[@class='responsive']//tr//following-sibling::td[1]' 不是有效的 XPath 表达式。谢了!
  • @Ricardo 你能用基于文本的格式化 HTML 更新问题以便快速分析吗?
  • 完成。但也许这是一个特定于网页的问题......再次感谢
  • 查看我的答案更新并让我知道状态。
  • 我这边还没有运气。我在 Dropbox 中添加了 .py 文件和错误打印屏幕。请看一下:dropbox.com/sh/nm5wwpdglbgohex/AAC2ZBYdpwgBSsQ9ErooHIwRa?dl=0 请让我知道此代码是否适合您。真的再次感谢
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2020-05-30
  • 2021-04-05
相关资源
最近更新 更多