为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Selenium 从网站中抓取值

使用 Selenium 从网站中抓取值

慕慕森 2022-03-09 20:27:07
我正在尝试从以下网站提取数据:https://www.tipranks.com/stocks/sui/stock-analysis我的目标是八角形中的值“6”:我相信我的目标是正确的 xpath。这是我的代码:import sysimport osfrom selenium.webdriver.firefox.firefox_binary import FirefoxBinaryfrom selenium import webdriveros.environ['MOZ_HEADLESS'] = '1'binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe', log_file=sys.stdout)browser = webdriver.PhantomJS(service_args=["--load-images=no", '--disk-cache=true'])url = 'https://www.tipranks.com/stocks/sui/stock-analysis'xpath = '/html/body/div[1]/div/div/div/div/main/div/div/article/div[2]/div/main/div[1]/div[2]/section[1]/div[1]/div[1]/div/svg/text/tspan'browser.get(url)element = browser.find_element_by_xpath(xpath)print(element)我可以看到问题是由于不正确的 xpath 造成的,但无法弄清楚原因。我还应该指出,我认为使用 selenium 是抓取该站点的最佳方法,并打算提取其他值并在多个页面上针对不同股票重复这些查询。如果有人认为 BeutifulSoup、lmxl 等我会更好,那么我很高兴听到建议!提前致谢!
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

你甚至没有声明所有路径。Octagonal 在哪个类的 div 中,client-components-ValueChange-shape__Octagon所以搜索这个 div。


x = browser.find_elements_by_css_selector("div[class='client-components-ValueChange-shape__Octagon']") ## Declare which class

for all in x:

    print all.text

输出 :


6


查看完整回答
反对 回复 2022-03-09
?
LEATH

TA贡献1936条经验 获得超6个赞

您可以尝试使用此 css 选择器[class$='shape__Octagon']来定位内容。如果我去pyppeteer,我会做以下事情:


import asyncio

from pyppeteer import launch


async def get_content(url):

    browser = await launch({"headless":True})

    [page] = await browser.pages()

    await page.goto(url)

    await page.waitForSelector("[class$='shape__Octagon']")

    value = await page.querySelectorEval("[class$='shape__Octagon']","e => e.innerText")

    return value


if __name__ == "__main__":

    url = "https://www.tipranks.com/stocks/sui/stock-analysis"

    loop = asyncio.get_event_loop()

    result = loop.run_until_complete(get_content(url))

    print(result.strip())

输出:


6


查看完整回答
反对 回复 2022-03-09
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您在这里似乎有两个问题:

对于 xpath,我刚刚做了:

xpath = '//div[@class="client-components-ValueChange-shape__Octagon"]'

然后做:

打印(元素。文本)

它得到你想要的价值。但是,您的代码实际上并没有等到浏览器完成加载页面后才执行 xpath。对我来说,使用 Firefox,我只有大约 40% 的时间以这种方式获得价值。Selenium 有很多方法可以处理这个问题,最简单的可能是在 browser.get 和 xpath 语句之间休眠几秒钟。

您似乎正在设置 Firefox,但随后使用 Phantom。我没有在 Phantom 上尝试过,Phantom 可能不需要睡眠行为。


查看完整回答
反对 回复 2022-03-09
  • 3 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信