我正在尝试从下面的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>
答案 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(), '
', '')
其中

是换行符,但您也可以添加需要移除的others characters。 source