【问题标题】:Xpath scrapy result not as expectedXpath scrapy 结果与预期不符
【发布时间】:2020-10-19 02:21:43
【问题描述】:

我正在尝试获取前面标记的值。这就是我正在做的事情:

html页面结构:

...
<tr class="destaque no-hover">
    <td class="periodo" colspan="6">2020.1</td>
</tr>
<tr class="linhaPar">
    <td>Text1</td>
    <td align="center">01</td>
    <td align="right">312h</td>
    <td align="center">3T12</td>
</tr>
<tr class="linhaImpar">
    <td>Text2</td>
    <td align="center">01</td>
    <td align="right">12h</td>
    <td align="center">5M12</td>
</tr>
...
<tr class="destaque no-hover">
    <td class="periodo" colspan="6">2016.1</td>
</tr>
<tr class="linhaPar">
    <td>Text7</td>
    <td align="center">01</td>
    <td align="right">2h</td>
    <td align="center">2N12</td>
</tr>
<tr class="linhaImpar">
    <td>Text8</td>
    <td align="center">01</td>
    <td align="right">32h</td>
    <td align="center">4T12</td>
</tr>
...
<tr class="destaque no-hover">
    <td class="periodo" colspan="6">2014.2</td>
</tr>
<tr class="linhaPar">
    <td>TextN-1</td>
    <td align="center">01</td>
    <td align="right">2h</td>
    <td align="center">2N12</td>
</tr>
<tr class="linhaImpar">
    <td>TextN</td>
    <td align="center">01</td>
    <td align="right">32h</td>
    <td align="center">4T12</td>
</tr>

所以,我正在尝试获取每个tr classes="linhaPar|linhaImpar" 的信息

for i in response.xpath('//tr[@class="linhaPar" or @class="linhaImpar"]')
    _aux = i.xpath('./td[1]')

但是,我也需要那些 td[@class="periodo"] 所以,我被 xpath 困住了

# I've tried this, but return a list of elements that matches, not the close one, as I want
    _p = _aux.xpath('./preceding::tr[td[@class="periodo"]')

# I've also tried this, but won't work
    _p = _aux.xpath('./preceding::tr[td[@class="periodo"] and position()=1]')

已解决

也许当我提出这个问题时,我还不够清楚。 periodo 将不同数量的 tr 变化放在一起。我尝试搜索的每一种方式,都向我返回可能的结果列表或 nada。为了解决这个问题,我尝试了在“for loop xpath”中考虑periodo的解决方案:

_p = ""
for i in response.xpath('//tr[@class="linhaPar" or @class="linhaImpar" or @class="destaque no-hover"]'):
    # Check if it's a td with period
    if 'destaque no-hover' == i.xpath('./@class').get():
        _p = i.xpath('./td/text()').get()
        continue # Force to go to the next one

【问题讨论】:

    标签: python python-3.x xpath scrapy logic


    【解决方案1】:

    这个 XPath:

    '//tr[@class="linhaPar" or @class="linhaImpar" or td[@class="periodo"]]' 
    

    【讨论】:

      【解决方案2】:

      假设您希望将其存储在 _p 中(每个 tr 上下文节点一个 periodo):

      ['2020.1'], ['2020.1'], ['2020.1'], ['2020.1']
      

      使用:

      ./preceding::td[@class="periodo"][1]
      

      假设您希望将其存储在_p(每组数据一个periodo):

      ['2020.1'], [], ['2020.2'], []
      

      使用:

      ./preceding-sibling::tr[1]/td[1][@class="periodo"]
      

      如果您需要从创建的列表中删除空元素,请稍后使用filter 执行此操作。

      对于第二种情况,如@Gilles Quenot 所述,您还可以将上下文节点更改为:

      //tr[@class="linhaPar" or @class="linhaImpar" or @class="destaque no-hover"]
      

      并填写您的清单:

      _aux = ./td[1][not(@class="periodo")]
      _p = ./td[1][@class="periodo"]
      

      或者:

      _aux = ./td[1][not(starts-with(text(),"2020."))]
      _p = ./td[1][starts-with(text(),"2020.")]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        相关资源
        最近更新 更多