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

时间:2014-08-04 16:02:34

标签: python parsing selenium xpath selenium-webdriver

我使用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行,in          p.loop()文件“parser4.py”,第37行,循环       self.eska(self.url_eskawarszawa)文件“parser4.py”,第27行,在eska       driver.find_element_by_xpath( '/ HTML /体/格[3] / DIV [1] /部分[2] / DIV / DIV / DIV [2] / UL /锂[2] / A [2]')   文件   “/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”   第230行,在find_element_by_xpath中       return self.find_element(by = By.XPATH,value = xpath)File“/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py”,   第662行,在find_element中       {'using':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中       raise exception_class(message,screen,stacktrace)selenium.common.exceptions.NoSuchElementException:Message:   u'{“errorMessage”:“无法找到带有xpath的元素   \ '/ HTML /体/格[3] / DIV [1] /部分[2] / DIV / DIV / DIV [2] / UL /锂[2] / A [2] \'”, “请求”: {“报头”:{“接受”:“应用/ JSON”,“接受编码”:“同一性”,“连接”:“关闭”,“内容长度”:“148”,“内容类型”: “应用程序/ JSON;字符集= UTF-8”, “主机”: “127.0.0.1:55583","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method” : “POST”, “邮报”: “{\” 使用\“:   \“xpath \”,\“sessionId \”:   \“e2fa7700-1bea-11e4-bd11-83e129ae286e \”,\“值\”:   \ “/ HTML /体/格[3] / DIV [1] /部分[2] / DIV / DIV / DIV [2] / UL /锂[2] / A [2] \”}”, “URL” : “/元件”, “urlParsed”:{ “锚”: “”, “查询”: “”, “文件”: “元件”, “目录”: “/”, “路径”: “/元件” “相对”: “/元件”, “端口”: “”, “宿主”: “”, “密码”: “”, “用户”: “”, “用户信息”: “”, “权威”: “” , “协议”: “”, “源”: “/元件”, “queryKey”:{}, “块”:[ “元件”]} “urlOriginal”:“/会话/ e2fa7700-1bea-11e4-BD11 -83e129ae286e /元件“}}”   ;屏幕截图:可通过屏幕获取

有谁知道这有什么问题?

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

编辑: 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 个答案:

答案 0 :(得分:3)

你提供的xpath是一个非常脆弱的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'

答案 1 :(得分:1)

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

一个更简单的xpath表达式可以使用://li[2]/a[2]