当前位置: 首页 > 知识库问答 >
问题:

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

戎泰
2023-03-14

我使用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(最近一次调用):File"parser4.py",第41行,p.loop()File"parser4.py",第37行,循环self.eska(self.url_eskawarszawa)File"parser4.py",第27行,在eskadriver.find_element_by_xpath('/html/body/div[3]/div[1]/Sect[2]/div/div[2]/ul/li[2]/a[2]')File"/usr/lib/python2.7/site-包/selenium/webDriver/远程/webdriver.py",行230,find_element_by_xpath返回self.find_element(by=By.XPATH, value=xpath)File"/usr/lib/python2.7/site-包/selenium/webDrive/远程/webdriver.py",第662行,在find_element{使用': by,'value': value})['value']File"/usr/lib/python2.7/site-包/selenium/webDrive/远程/webdriver.py",第173行,在执行self.error_handler.check_response(响应)File"/usr/lib/python2.7/site-包/selenium/webDriver/远程/errorhandler.py",第164行,check_response提出exception_class(消息,屏幕,stackTrace)selenium.common.exceptions.NoSuchElementExcure: Message: u'{"errorMessage":"无法找到具有xpath\'/html/body/div[3]/div[1]/Sect[2]/div/div[2]/ul/li[2]/a[2]\'的元素","请求":{"头":{"接受":"应用程序/json","接受"-编码":"标识","连接":"关闭","内容长度":"148","内容类型":"应用程序/json; charset=UTF-8","主机":"127.0.0.1:55583","用户代理":"Python-urllib/2.7"},"http版本":"1.1","方法":"POST","post":"{\"使用\":\"xpath\",\"secsionId\":\"e2fa7700-1bea-11e4-bd11-83e129ae286e\",\"value\": \"/html/body/div[3]/div[1]/sect[2]/div/div/div[2]/ul/li[2]/a[2]\"}","url":"/元素","urlParded":{"锚":"","查询":"","文件":"元素","目录":"/","路径":"/元素","相对":"/元素","端口":","主机":"","密码":"","用户":","用户信息":"","权限":"","协议":","源"":"/元素","queryKey":{},"块":["元素"]},"URL":"/session/e2fa7700-1bea-11e4-bd11-83e129ae286e/元素"}}";屏幕截图:可通过屏幕获得

有人知道这有什么问题吗?

编辑:thx伙计们,我终于找到了解决问题的办法。xpath很好(但实际上很脆弱)

我使用火狐驱动程序,我看到了问题广告。

最后,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个答案

吕昀
2023-03-14

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

一个简单得多的xpath表达式是这样的://li[2]/a[2]

吴单鹗
2023-03-14

您提供的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'
 类似资料:
  • 问题内容: 我正在使用NodeJS 请求-简化的HTTP客户端 我似乎在使用HTTPS网站时遇到问题,但没有得到结果。 在Postman上测试了API端点(我不能共享),我只是关闭了SSL,它起作用了,我该如何使用请求插件做同样的事情? 问题答案: 只需添加以下行: 因此,您的代码如下所示:

  • 我尝试使用PHP 5.6运行我的Joomla 1.x网站,并收到以下错误: 严格的标准:KHttpUri::set() 的声明应该与 /home/beauty/www/libraries/koowa/http/uri.php 中的 KObject::set($property, $value = NULL) 兼容 在第 0 行 严格标准:KHttpUri::get() 的声明应该与 /home/b

  • 我试图捕获并存储svg元素中出现的一些文本,例如 我有一个我正在使用的方法,它适用于其他元素,但Selenium WebElement类方法getText不会为上述svg元素返回任何文本。 下面是上述示例的xpath 我可以使用findElement(By.xpath(myXpath)),但是当我调用. getText()时,它不会返回任何值,也不会抛出任何错误。 我有没有做错什么,或者可能有其他

  • 问题内容: 我正在尝试在python中使用基本身份验证 响应表单 auth 变量: 但是,当我尝试从其他位置获取数据时-我收到401错误 据我了解-在第二个请求中不是替换的会话参数。 问题答案: 您需要使用会话对象,并向 每个请求 发送身份验证。该会话还将为您跟踪Cookie:

  • 我正在使用spring(4.2.0.RELEASE)、hibernate validator(5.2.1.Final)和validation api(1.1.0.Final)对后端应用程序进行JSR验证,配置如下:, 但是没有一个JSR303注释在我的应用程序中工作。 注意:在POJO类上添加了JSR303注释,在服务类(使用POJO)上添加了@Validated注释,还尝试在方法级别添加@Val

  • 问题内容: 我应该为XPath使用什么软件包?我想查询元素,然后在这些节点周围提取一些值。也许一个或多个级别更高,有些属性。 是XPath 1.0。是和走正道,还是有更现代的实现?非常尴尬,JDOM似乎容易得多。 问题答案: 您可能会考虑基于Java的XPath 2.0或XQuery实现(XSLT 2.0选项提供了更强大的功能),例如 Saxon9.x 。 Saxon是开源的,并且是迄今为止基于J