Scrapy爬取网页:如何从指定div类中提取特定元素并获取上级div的发布日期
解决Scrapy提取指定元素与关联日期的问题
我来帮你搞定这个Scrapy提取需求!你当前的XPath是拿到整个div内容,我们可以通过精准定位子元素和关联相邻节点来获取你需要的三个字段:文章链接、标题以及上方的发布日期。
分步实现方案
- 提取文章链接(href):假设你的链接是在
link类div下的<a>标签里,用相对路径定位该标签的href属性:article_links = response.xpath('//div[contains(@class, "link")]/a/@href').extract() - 提取文章标题(clktrk):如果
clktrk是<a>标签的属性,用这个XPath;如果是标签内的文本,把@clktrk换成text()即可:article_titles = response.xpath('//div[contains(@class, "link")]/a/@clktrk').extract() - 提取关联的发布日期:日期div在目标div的上方,用
preceding-sibling选择器找到最近的那个date pretyDate compact类div:publish_dates = response.xpath('//div[contains(@class, "link")]/preceding-sibling::div[contains(@class, "date pretyDate compact")][1]/text()').extract()
更优雅的遍历方式(推荐)
如果要确保每个文章的三个字段一一对应,建议遍历每个link类div,再在每个节点内提取数据,避免因页面结构变化导致字段错位:
# 获取所有目标div节点 link_divs = response.xpath('//div[contains(@class, "link")]') for div in link_divs: # 提取当前div下的链接 link = div.xpath('./a/@href').get() # 提取标题(根据实际结构调整,这里假设是clktrk属性) title = div.xpath('./a/@clktrk').get() # 提取上方最近的日期 date = div.xpath('./preceding-sibling::div[contains(@class, "date pretyDate compact")][1]/text()').get() # 处理数据(比如存入Scrapy Item,或者打印调试) item = { 'title': title.strip() if title else None, 'link': link, 'publish_date': date.strip() if date else None } print(item)
注意事项
- 如果页面中
clktrk不是<a>标签的属性,而是某个子标签的文本,记得调整XPath路径,比如./h3/text()(假设标题在h3标签里)。 - 使用
.get()替代.extract()可以获取单个值,避免返回列表;如果有多个匹配项,用.getall()。
内容的提问来源于stack exchange,提问作者Basiez
相关产品推荐
相关产品推荐

