scrapy XPath是否选择以下直到某个条件?

gfttwv5a  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(130)

我在从以下节点选择产品时遇到问题。以下是html:

<div>
      <p>Order ID 1</p>
      <p style="display:none"></p>
      <p>product 1</p>

      <p>Order ID 2</p>
      <p style="display:none"></p>
      <p>product 1</p>
      <p>product 2</p>

      <p>Order ID 3</p>
      <p style="display:none"></p>
      <p>product 1</p>
      <p>product 2</p>

      <p>Order ID 4</p>
      <p style="display:none"></p>
      <p>product 1</p>
      <p>product 2</p>
      <p>product 3</p>

      <p>Order ID 5</p>
      <p style="display:none"></p>
      <p>product 1</p>  

    </div>

我选择了具有以下代码的订单ID:

//div/p[@style="display:none"]/preceding-sibling::p[1]

有没有办法选择产品?代码我试过:

//div/p[@style="display:none"]/following::p[not(@style="display:none" )]

实验结果:

<p>product 1</p>
<p>Order ID 2</p>
<p>product 1</p>
<p>product 2</p>
<p>Order ID 3</p>
<p>product 1</p>
<p>product 2</p>
<p>Order ID 4</p>
<p>product 1</p>
<p>product 2</p>
<p>product 3</p>
<p>Order ID 5</p>
<p>product 1</p>

如何取消选择订单ID

gpfsuwkq

gpfsuwkq1#

您可以尝试使用text()内容,如下所示:
//div/p[contains(text(), 'product')]/text()

//div/p[not(contains(text(), 'Order'))]/text()
在python中使用Scrapy,使用extract()函数的输出为:
['product 1', 'product 1', 'product 2', 'product 1', 'product 2', 'product 1', 'product 2', 'product 3', 'product 1']

3phpmpom

3phpmpom2#

I.使用

/div/p[@style='display:none']
      /following-sibling::p[not(@style)]
                             [not(following-sibling::p[1][@style='display:none'])]

二.说明

简单地说,此XPath表达式指示XPath引擎执行以下操作:

  • 获取所有**p元素的以下所有同级元素,这些元素是顶级元素div的子级,并且具有值为字符串"display:none"style属性,使得(以下这些同级)本身没有style属性,和不是p元素的前一个同级元素,该元素具有值为字符串"display:none"*style**属性

III.基于XSLT的验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "/div/p[@style='display:none']
            /following-sibling::p[not(@style)]
                                   [not(following-sibling::p[1][@style='display:none'])]
    "/>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的XML文档时:

<div>
    <p>Order ID 1</p>
    <p style="display:none"></p>
    <p>product 1</p>
    <p>Order ID 2</p>
    <p style="display:none"></p>
    <p>product 1</p>
    <p>product 2</p>
    <p>Order ID 3</p>
    <p style="display:none"></p>
    <p>product 1</p>
    <p>product 2</p>
    <p>Order ID 4</p>
    <p style="display:none"></p>
    <p>product 1</p>
    <p>product 2</p>
    <p>product 3</p>
    <p>Order ID 5</p>
    <p style="display:none"></p>
    <p>product 1</p>
</div>

计算XPath表达式,并将其(所需的、正确的)结果复制到输出中

<p>product 1</p>
<p>product 1</p>
<p>product 2</p>
<p>product 1</p>
<p>product 2</p>
<p>product 1</p>
<p>product 2</p>
<p>product 3</p>
<p>product 1</p>

以下是使用XPath可视化工具计算此XPath表达式的屏幕截图:

nfg76nw0

nfg76nw03#

您可以检查p标签,其后续同级标签不具有该样式(这不适用于Order ID i)。

scrapy shell

In [1]: from scrapy import Selector

In [2]: html=""" <div>
   ...:       <p>Order ID 1</p>
   ...:       <p style="display:none"></p>
   ...:       <p>product 1</p>
   ...: 
   ...:       <p>Order ID 2</p>
   ...:       <p style="display:none"></p>
   ...:       <p>product 1</p>
   ...:       <p>product 2</p>
   ...:       
   ...:       <p>Order ID 3</p>
   ...:       <p style="display:none"></p>
   ...:       <p>product 1</p>
   ...:       <p>product 2</p>
   ...:     
   ...:       <p>Order ID 4</p>
   ...:       <p style="display:none"></p>
   ...:       <p>product 1</p>
   ...:       <p>product 2</p>
   ...:       <p>product 3</p>
   ...:      
   ...:       <p>Order ID 5</p>
   ...:       <p style="display:none"></p>
   ...:       <p>product 1</p>  
   ...:       
   ...:     </div>"""

In [3]: sel = Selector(text=html)

In [4]: sel.xpath('//div/p[@style="display:none"]/following::p[not(following::p[1][@style="display:none"])]/text()').ge
   ...: tall()
Out[4]:
['product 1',
 'product 1',
 'product 2',
 'product 1',
 'product 2',
 'product 1',
 'product 2',
 'product 3',
 'product 1']

相关问题