首页 文章

xpath不适用于此站点,请验证

提问于
浏览
0

我使用Python与selenium(PhantomJS webdriver)来解析网站,我有问题 .

我想从这个广播网站获得当前的歌曲:http://www.eskago.pl/radio/eska-warszawa .

XPath的:

/html/body/div[3]/div[1]/section[2]/div/div/div[2]/ul/li[2]/a[2]

该xpath不适用于python selenium

错误:

Traceback(最近一次调用最后一次):文件“parser4.py”,第41行,在p.loop()文件“parser4.py”,第37行,在循环self.eska(self.url_eskawarszawa)文件“parser4.py” “,第27行,在eska driver.find_element_by_xpath('/ html / body / div [3] / div [1] / section [2] / div / div / div [2] / ul / li [2] / a [ 2]')文件“/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”,第230行,在find_element_by_xpath中返回self.find_element(by = By.XPATH,value = xpath)文件“/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”,第662行,在find_element中{'使用':by,'value':value})['value']文件“/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”,第173行,执行self.error_handler.check_response(response)文件“/usr/lib/python2.7/ site-packages / selenium / webdriver / remote / errorhandler.py“,第164行,在check_response中引发exception_class(消息,屏幕,堆栈跟踪)selenium.common.exceptions.NoSuchElementException:消息:u'{”errorMessage“:”无法找到元素与xpath '/ html / body / div [3] / div [1] / section [2] / div / div / div [2] / ul / li [2] / a [2] '“,”请求“:{”报头“:{”接受“:”应用/ JSON“‘接受编码’:‘同一性’,‘连接’:‘关闭’,‘内容长度’:‘148’,”内容类型“:” 应用/ JSON;字符集= UTF-8" , “主机”: “127.0.0.1:55583","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1”,”方法“:”POST“,”post“:”{\“using \”:\“xpath \”,\“sessionId \”:\“e2fa7700-1bea-11e4-bd11-83e129ae286e \”,\“value \” :\“/ html / body / div [3] / div [1] / section [2] / div / div / div [2] / ul / li [2] / a [2] \”}“,”url “:”/元件”, “urlParsed”:{ “锚”: “”, “查询”: “”, “文件”: “元件”, “目录”: “/”, “路径”: “/元素” , “相对”: “/元件”, “端口”: “”, “宿主”: “”, “密码”: “”, “用户”: “”, “用户信息”: “”, “权威”:” “ ”协议“: ”“, ”源“: ”/元件“, ”queryKey“:{}, ”块“:[ ”元件“]} ”urlOriginal“:”/会话/ e2fa7700-1bea-11e4- bd11-83e129ae286e / element“}}';屏幕截图:通过屏幕提供

有谁知道这有什么问题?

--------------------------------------

编辑:thx家伙的答案我终于找到了我的问题的解决方案 . xpath很好(但实际上很脆弱)

我使用firefox驱动程序,我看到问题 - 广告 .

我不得不跳过它们,我决定使用另一个没有这个广告的页面:http://www.eskago.pl/radio

和finnaly,thx alecxe - 我用这个:

driver.find_element_by_xpath('//a[@class="radio-tab-button"]/span/strong').click()
element = driver.find_element_by_xpath('//p[@class="onAirStreamId_999"]/strong')
print element.text

并且工作完美 .

2 回答

  • 1

    你提供的xpath是一个非常脆弱的,现在想知道你得到 NoSuchElementException 异常 .

    相反,依赖于 a 标签的类名,里面有一首当前播放的歌曲:

    <a class="playlist_small" href="http://www.eskago.pl/radio/eska-warszawa?noreload=yes">
        <img style="width:41px;" src="http://t-eska.cdn.smcloud.net/common/l/Q/s/lQ2009158Xvbl.jpg/ru-0-ra-45,45-n-lQ2009158Xvbl_jessie_j_bang_bang.jpg" alt="">
        <strong>Jessie J, Ariana Grande, Nicki Minaj</strong>
        <span>Bang Bang</span>
    </a>
    

    这是示例代码:

    element = driver.find_element_by_xpath('//a[@class="playlist_small"]/strong')
    print element.text
    

    那么,另一种检索当前播放歌曲的方法是模仿网站为播放列表制作的JSONP响应:

    >>> import requests
    >>> import json
    >>> import re
    >>> response = requests.get('http://static.eska.pl/m/playlist/channel-999.jsonp')
    >>> json_data = re.match('jsonp\((.*?)\);', response.content).group(1)
    >>> songs = json.loads(json_data)
    >>> current_song = songs[0]
    >>> [artist['name'] for artist in current_song['artists']]
    [u'David Guetta', u'Showtek', u'Vassy']
    >>> current_song['name']
    u'Bad'
    
  • 3

    正如alecxe所提到的,如果页面结构发生任何变化,那么xpath就会破裂 .

    一个更简单的xpath表达式将起作用: //li[2]/a[2]

相关问题