【问题标题】:Find element by XPath in Python在 Python 中通过 XPath 查找元素
【发布时间】:2020-05-07 22:50:39
【问题描述】:

我想从网站上提取一些赔率:

https://www.oddsportal.com/soccer/europe/champions-league-2015-2016/real-madrid-manchester-city-dhJZn1pn/#1X2;2

例如,1xbet 的主场赔率是 1.5,我复制该赔率的 XPath 表达式并将其插入到 find_element_by_Xpath

这是我的小代码:

> from selenium import webdriver from bs4 import BeautifulSoup
>
> driver = webdriver.Firefox() url =
> 'https://www.oddsportal.com/soccer/europe/champions-league-2015-2016/real-madrid-manchester-city-dhJZn1pn/#1X2;2'
> driver.get(url) print(driver.title)
>
> element =
> driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/div[7]/div[1]/table/tbody/tr[2]/td[1]/div/a[2]")
>
> print(element.text)
>
> driver.close()

不幸的是,答案是一个错误:

hao@hao-ThinkPad-T420:~$ ./testodds.py 皇家马德里 - 曼城 投注赔率,足球 - 欧洲冠军联赛 2015/2016 追溯(最 最近通话最后):文件“./testodds.py”,第 12 行,在 element = driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1] /div[7]/div[1]/table/tbody/tr[2]/td[1]/div/a[2]") 文件 "/home/hao/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", 第 394 行,在 find_element_by_xpath 中 return self.find_element(by=By.XPATH, value=xpath) 文件“/home/hao/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py”, 第 978 行,在 find_element 中 'value': value})['value'] 文件 "/home/hao/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", 第 321 行,在执行中 self.error_handler.check_response(response) 文件“/home/hao/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py”, 第 242 行,在 check_response 中 引发异常类(消息,屏幕,堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:无法 定位元素: /html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/div[7]/div [1]/table/tbody/tr[2]/td[1]/div/a[2]

【问题讨论】:

    标签: python selenium-webdriver xpath


    【解决方案1】:

    试试这个 XPath 表达式:

    .//table[@class='table-main detail-odds sortable']/tbody/tr/td[2]/div
    

    【讨论】:

      【解决方案2】:

      您的 XPath 表达式不正确。

      您的 XPath 表达式是这样的: "/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/div[7]/div[1]/table/tbody/tr[2]/td[1]/div/a[2]"

      你想要这个: /html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/div[8]/div[1]/table/tbody/tr[1]/td[2]/div

      这是完整的工作代码。我成功地抓住了机会。

      from selenium import webdriver
      from bs4 import BeautifulSoup
      
      driver = webdriver.Firefox()
      url ='https://www.oddsportal.com/soccer/europe/champions-league-2015-2016/real-madrid-manchester-city-dhJZn1pn/#1X2;2'
      driver.get(url)
      print(driver.title)
      element = driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/div[8]/div[1]/table/tbody/tr[1]/td[2]/div")
      print(element.text)
      driver.close()
      

      【讨论】:

      • 另一个问题:
      • 当我使用检查器在奇数 1.5 上复制 xpath 它给了我:
      • /html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1 ]/div[7]/div[1]/table/tbody/tr[2]/td[1]/div/ 错误来自 div[7] 为什么?
      • @ahmedaao 我不太确定那是哪个元素,但他们经常抛出假元素来阻止像你这样的爬虫。公司通常不喜欢人们这样做。
      【解决方案3】:

      试试这个 XPath 表达式。

      //div[@id="odds-data-table"]//td//a[contains(text(), "1xBet")]//ancestor::tr//td[2]

      最好编写自己的 XPath 表达式,而不是从浏览器中复制,因为浏览器会根据元素相对于 id 或根的最近元素的位置给出一个结构非常紧凑的 XPath 表达式。如果任何地方发生任何变化,您的 XPath 表达式将不起作用。

      【讨论】:

        猜你喜欢
        • 2020-02-06
        • 2020-07-20
        • 2020-08-08
        • 2020-05-03
        • 2016-10-31
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 2016-03-12
        相关资源
        最近更新 更多