使用XPath查找文本字段列表

时间:2018-09-15 20:54:13

标签: python-3.x xpath scrapy

使用scrapy并提供此HTML代码

<div class="parts"> 
<b>Part1 :</b> 
<a href='/part1.htm'>name 1</a> 
<br> 
<b> Part2 : </b> 
<a href='/part21.htm'>name 21</a>, 
<a href='/part22.htm'>name 22</a>, 
<a href='/part23.htm'>name 23</a>
<br> 
<b> Part3 : </b> 
<a href='/parts31.htm'>name 31</a>, 
<a href='/part32.htm'>name 32</a> 
<br>
</div>

我想在每个<b>部分之后提取每个系列的名称。

对于第一个(只有一个名称),它与此配合使用

response.xpath('//div[@class="parts"]/b[contains(text(),"Part1")]/following::a/text()').extract_first()

这将导致“名称1”

对于第二个,我希望以下内容为我提供一个带有“名称21”,“名称22”和“名称23”的列表,即在下一个b标签之前停止,但返回的列表也包含“名称31”和'名称32'

response.xpath('//div[@class="parts"]/b[contains(text(),"Part2")]/following::a/text()')

如何将列表限制为仅在'Part2'b标签之后和'Part3'b标签之前?

2 个答案:

答案 0 :(得分:0)

一种在包含text()的{​​{1}}和包含{{1}的<a>之间选择<b>的所有Part2子元素的一种方法}:

<b>

另一种方法是选择Part3的所有/div/b[contains(., 'Part2')]/following-sibling::a[following-sibling::b[contains(.,'Part3')]]/text() 个子元素,它们是text()的后继兄弟姐妹,其中包含<a>,并且谁是第一个在先兄弟姐妹<b>包含Part2

<b>

答案 1 :(得分:0)

我建议您使用另一种方法:仅获取所有名称,并为每个名称获取相应的<b>部分:

data = {}
for name_node in response.xpath('//div[@class="parts"]/a'):
    name = name_node.xpath('./text()').extract_first()
    section_name = name_node.xpath('./preceding-sibling::b[1]/text()').extract_first()

    if section_name not in data:
        data[section_name] = []
    data[section_name].append(name)

print(data["Part2 :"][1])