2016-10-25 55 views
0

這是針對紙張的web page。有一些有用的信息可以提取。在自定義標籤中提取文本使用Scrapy

我想提取本文的標題,作者和摘要。所以我寫了下面的代碼:

class PublicationSpider(scrapy.Spider): 
    name = "publications" 
    start_urls = [ 
     'https://www.ncbi.nlm.nih.gov/pubmed/15721472', 
    ] 

    def parse(self, response): 
     for publication in response.css('div.rprt.abstract'): 
      yield { 
       'title': publication.css('h1::text').extract_first(), 
       'author': publication.css('div.auths > a::text').extract(), 
       'abstract': publication.css('div.abstr abstracttext::text').extract(), 
       'doi': publication.css('div.aux a::text').extract_first(), 
      } 

不幸的是,上面的代碼不能返回正確的內容。看來Scrapy無法識別abstracttext元素。

我試圖用h4替換abstracttext,劇本進行得很順利。

那麼我如何提取abstracttext中的內容呢?

+0

您的代碼爲我工作。嘗試'scrapy shell 'then'response.css('div.abstr abstracttext :: text')',結果就在那裏。這可能是由於某種原因,你的'lxml'後端以不同的方式呈現答案,你正在運行什麼操作系統?你也可以試試'pip show lxml'並告訴我們版本? – Granitosaurus

+0

@Granitosaurus是的,它在'scrapy shell'中工作,但不適用於Python腳本。 –

+0

你的蜘蛛爲我工作。你可以發佈你的'settings.py'嗎?你有沒有中間件或管道啓用?你還可以發佈整個運行日誌嗎?你可以通過'scrapy crawl spider 2>&1> output.log' – Granitosaurus

回答

-1

您可以使用以下xpath獲取值。

title = publication.xpath("//div[@class='rprt_all']/div/h1/text()").extract() 
+0

它適用於'h1',但不適用於名爲'abstracttext'的標籤 –

0

我找到了一個替代的解決方案只需使用lxml

from lxml import html 
from requests import get as getRequest 

htmlPage = getRequest('https://www.ncbi.nlm.nih.gov/pubmed/15721472') 
htmlTree = html.fromstring(htmlPage.content) 

title    = htmlTree.xpath('//div[@class="rprt abstract"]/h1/text()') 
authors    = htmlTree.xpath('//div[@class="auths"]/a/text()') 
doi     = htmlTree.xpath('//dl[@class="rprtid"]/dd/a/text()') 
abstractHeadings = htmlTree.xpath('//div[@class="abstr"]/div/h4/text()') 
abstractTexts  = htmlTree.xpath('//div[@class="abstr"]/div/p/abstracttext/text()') 

參考:

相關問題