我使用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
并且工作得很好。
答案 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]