更优雅的xpath解决方案?

时间:2017-11-15 04:10:10

标签: python-2.7 selenium xpath

我正在抓论一个论坛,我正在尝试检索有关帖子的统计信息,特别是帖子获得的观看次数和回复数量。

我正在解析的内容的页面源代码如下:

['bar','ter']

而且我已经将一些能够解决我正在寻找的问题的代码整合在一起,但我很想知道xpath专家会如何解决这个问题。

<ul class="ipsDataItem_stats">
<li>
    <span class="ipsDataItem_stats_number">61</span>
    <span class="ipsDataItem_stats_type"> replies</span>
</li>
<li class="ipsType_light">
    <span class="ipsDataItem_stats_number">6,106</span>
    <span class="ipsDataItem_stats_type"> views</span>
</li>           

我的解决方案依赖于按特定顺序排列的统计数据,我想知道是否有更准确的方法来实现相同的结果。

例如伪代码:

Stats = node.find_elements_by_xpath('.//ul[@class="ipsDataItem_stats"]')
Replies = (Stats[0].find_elements_by_xpath('.//span[@class="ipsDataItem_stats_number"]'))[0].text
Views = (Stats[0].find_elements_by_xpath('.//span[@class="ipsDataItem_stats_number"]'))[1].text

3 个答案:

答案 0 :(得分:0)

  

我正在寻找一种更准确地获取我的元素的方法   之后不依赖他们在名单中的位置。

元素可以通过类名

相互区分
<span class="ipsDataItem_stats_number">61</span>
<span class="ipsDataItem_stats_type"> replies</span>

所以对第一个元素使用下面的xpath表达式:

.//span[ contains( @class, 'stats_number')]

和第二个元素

.//span[ contains( @class, 'stats_type')]

通过这种方式,表达式将抵制元素顺序的改变。

答案 1 :(得分:0)

我会用两步管道解决这个问题。第一步是使用XSLT转换为更干净的XML格式,第二步是查询干净的XML。此片段的已清理XML可能如下所示:

<ipsDataItem_stats>
  <replies>61</replies>
  <views>6106</views>
</ipsDataItem_stats>

这种方法的好处是清理阶段完全可重用,并且与您想要运行的实际查询无关;一旦编写,它使任何后续查询都更容易编写。

答案 2 :(得分:0)

您可以查看描述统计信息的标签。一般的xpath看起来像这样:

'//ul[@class="ipsDataItem_stats"][<FILL HERE RECORDS POSITION>]//li[contains(., "<FILL HERE RECORDS LABEL>")]/span[@class="ipsDataItem_stats_number"]'

对于回复和视图,我们得到以下xpath:

FirstRecordsRepliesXpath = '//ul[@class="ipsDataItem_stats"][0]//li[contains(., "replies")]/span[@class="ipsDataItem_stats_number"]'
FirstRecordsViewsXpath = '//ul[@class="ipsDataItem_stats"][0]//li[contains(., "views")]/span[@class="ipsDataItem_stats_number"]'

通过这种方式,您无需了解订单。但你需要知道标签,这应该没问题。