对于一个元素的XPath,它遵循嵌套在div中的某些特定段落文本?

时间:2018-04-30 04:28:16

标签: html xml xpath

我正在尝试从下面的html中选择文本“Part Sun,Sun”和“Herb”,“Houseplant”。

<div class="specifics">有更多这些“行”div,而我感兴趣的文本总是在包含特定文本的某些段落标记之后,如下面的“Light:”和“Type:”。

编辑:为了澄清所有“价值”div,我只对具有特定“名称”的那些感兴趣。所以我想检查嵌套在<div class="name">元素中的段落的文本,如果它是我感兴趣的,那么选择后续<div class="value">元素中的文本。

<div class="specifics">
  <div class="row">
    <div class="name">
      <p>Light:</p>
    </div>
    <div class="value">
      <p>Part Sun, Sun</p>
    </div>
  </div>
  <div class="row">
    <div class="name">
      <p>Type:</p>
    </div>
    <div class="value">
      <p>
        <a href="https://www.bhg.com/gardening/plant-dictionary/herb/">Herb</a>, <a href="https://www.bhg.com/gardening/plant-dictionary/houseplant/">Houseplant</a>
      </p>
    </div>
  </div>
  ...more rows...
</div>

我试过这个(使用Scrapy):

trait = response.xpath("//div[@class='specifics']")
trait.xpath(".//div[@class='row']/div[@class='name']/p[text()='Light:']/../../div[@class='value']/p/text()[normalize-space()]") 

第一行是好的,但第二行正在返回\n \n

最初编辑不好的道歉,下面是段落元素的实际外观。

第二次编辑:有一堆空行,当我选择只有/ p而没有文本()时,我仍然只返回一堆没有任何文本的\ n?如上所述尝试标准化空间。

  <p>




                                            Part Sun, 






                                            Sun



  </p>

1 个答案:

答案 0 :(得分:0)

要选择所需的元素,您可以执行以下操作: /div[@class='specifics']/div[@class='row']/div[@class='value']/p

在最后添加/text()将获取第一行中的Part Sun, Sun,但由于第二行中包含其他嵌套元素,因此不会拾取该文本。

相反,您可以使用/string(),它也会从儿童中提取文字。 /div[@class='specifics']/div[@class='row']/div[@class='value']/p/string()

如果您还需要删除空格,则可以使用normalize-whitespace()translate(input, charsToReplace, replacement)

  • /div[@class='specifics']/div[@class='row']/div[@class='value']/p/normalize-space(string())。使用this tool我获得String='Part Sun, Sun'String='Herb, Houseplant'

  • 的输出
  • /div[@class='specifics']/div[@class='row']/div[@class='value']/p/translate(string(), '&#xA;', '')其中&#xA;是换行符,但您也可以添加需要移除的others characterssource