使用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标签之前?
答案 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])