如何在使用scrapy时从多个标记中排除一个特定的html标记(没有任何id)?

2024-09-19 23:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

<div class="region size2of3">
<h2>Mumbai</h2>
<strong>Fort</strong>
<div>Elphinstone building, Horniman Circle,</div>
<div>Veer Nariman Road, Fort</div>
<div>Mumbai 400001</div>
<div>Timings: 08:00-00:30 hrs (Mon-Sun)</div>
<div><br></div>
</div>

我想在解析时排除“Timings:08:00-00:30 hrs(Mon-Sun)”div标记。在

我的代码是:

^{pr2}$

Tags: divh2regionclassstrongsunbuildingmon
1条回答
网友
1楼 · 发布于 2024-09-19 23:31:12

我将使用^{} XPath function来获取div元素以“timeings”开头的文本:

sel.xpath('.//div[starts-with(., "Timings")]/text()').extract()

请注意,页面的HTML结构不容易区分彼此之间的位置-没有特定于位置的容器可以迭代。在本例中,我将找到每个h2strong标记并使用following-sibling,例如Scrapy Shell

^{pr2}$

还要注意,如果要提取时间范围值,可以使用^{}

In [18]: for sel in response.xpath('//div[contains(@class, "region")]/*[self::h2 or self::strong]'):
        name = sel.xpath('text()').extract()[0]
        timings = sel.xpath('./following-sibling::div[starts-with(., "Timings")]/text()')[0].re(r'(\d+:\d+)\s*\-\s*(\d+:\d+)')[:2]
        print name, timings
Mumbai [u'08:00', u'00:30']
Fort [u'08:00', u'00:30']
Colaba [u'07:00', u'01:00']
Goregaon [u'10:00', u'23:30']
...
Hi-Tech City [u'09:00', u'22:30']
Madhapur [u'11:00', u'23:00']
Banjara Hills [u'10:00', u'22:30']

另外,确保循环体中有yield(请参阅您发布的代码)。在


如果要排除Timings并获取其余位置描述,请使用:

for sel in response.xpath('//div[contains(@class, "region")]/*[self::h2 or self::strong]'):
    print " ".join(item.strip() for item in sel.xpath('following-sibling::div[position() < 4 and not(starts-with(., "Timings"))]/text()').extract())

相关问题 更多 >