1. 程式人生 > >python+lxml+xpath提取nature網站中的article基本資訊【初級版】

python+lxml+xpath提取nature網站中的article基本資訊【初級版】

下圖為網站上的一篇article,可以明顯提取到:題目,作者,作者單位(afiliation),貢獻情況,通訊作者(corresponding author),

期號,卷號,投稿時間,接收時間,發表時間

摘要,主題(下圖中未擷取,可點選網頁檢視)


1、html原始碼的獲取,儲存到nature.txt

def fetch(url):
	http_request = urllib2.Request(url = url)
	http_response = urllib2.urlopen(http_request, data = None, timeout = 600)
	#http_response rturns a file-like object, so it can read()

	status_code = http_response.getcode()

	if status_code != 200:
		print "Error : " , status_code
	else:
		print "Succesful!"

	print "-----  start downloading date  -----"
	html_doc = http_response.read()
	fn = open('nature.txt','w')
	fn.write(html_doc)
	print "-----  finish downloading data  -----"
	fn.close()

2、解析html檔案,提取資訊
def parse(file_path):
	# html sourse : nature journal, one artical
	# title , 
	# authors ,
	# journal name
	# volume
	# page (xxx - xxx)
	# datetime 
	# doi
	article_info = {}  # to store these features

	f = codecs.open(file_path , 'r' , 'utf-8')
	content = f.read()
	f.close()

	tree = etree.HTML(content)

	# nodes = tree.xpath(u"//a[@class = 'name']/span[@class = 'fn']")
	title = tree.xpath(u"//h1[@class='article-heading']")
	article_info['title'] = title[0].text
	
	authors = []
	authors_nodes = tree.xpath(u"//a[@class = 'name']/span[@class = 'fn']")
	for node in authors_nodes:
		authors.append(node.text)
	article_info['authors']  = authors

	journal_name = tree.xpath(u"//dl[@class = 'citation']/dd[@class = 'journal-title']")
	article_info['journal_name'] = journal_name[0].text

	volume = tree.xpath(u"//dl[@class = 'citation']/dd[@class = 'volume']")
	article_info['volume'] = volume[0].text.strip()

	page = tree.xpath(u"//dl[@class = 'citation']/dd[@class = 'page']")
	article_info['page'] = page[0].text

	datePublished = tree.xpath(u"//dt[@class = 'published']/following-sibling::dd[1]/time")
	article_info['datePublished'] = datePublished[0].text.strip(punctuation)

	dateReceived = tree.xpath(u"//dt[@class = 'received first']/following-sibling::dd[1]/time")
	article_info['dateReceived'] = dateReceived[0].text.strip()

	dateAccepted = tree.xpath(u"//dt[@class = 'accepted']/following-sibling::dd[1]/time")
	article_info['dateAccepted'] = dateAccepted[0].text	.strip()

	doi = tree.xpath(u"//dd[@class = 'doi']")
	article_info['doi'] = doi[0].text

	abstract = tree.xpath(u"//h1[text() = 'Abstract']/following-sibling::div[1]/p/text()")
	# article_info['abstract'] = abstract
	# print etree.tostring(abstract , pretty_print = True)
	print abstract

	subject_terms = tree.xpath(u"//h2[text() = 'Subject terms:']/following-sibling::ul[1]/*/a/text()")
	article_info['subjectTerms'] = subject_terms

	return article_info

目前解析xml或html的python庫常見的有:beautifulsoup ,lxml,pyquery,scrapy,還有萬能的正則表示式

lxml速度最快,

正則的提取速度與表示式寫的質量有關,有時提取相同的內容但是不同的正則表示式速度可以相差10倍

pyquery是基於lxml的

beautifulsoup4最慢

scrapy挺強大的,但鄙人不才還沒用過

【注】以上程式碼提取abstract部分有點問題,

<p>
    'p第一部分'
    <i>
         'i第一部分'
    </i>
    'p第二部分'
    <i>
         'i第二部分'
    </i>
    'p第三部分'
</p>

需要把<p>標籤下所有文字部分提取出來(包括<i>中內容),但是目前沒有在xpath中找到解決辦法

相關推薦

python+lxml+xpath提取nature網站article基本資訊初級

下圖為網站上的一篇article,可以明顯提取到:題目,作者,作者單位(afiliation),貢獻情況,通訊作者(corresponding author), 期號,卷號,投稿時間,接收時間,發表時間 摘要,主題(下圖中未擷取,可點選網頁檢視) 1、html原始碼的

xpath 提取一個屬性含有的多個屬性值,contains()

xpath如何取包含多個class屬性 如果HTML結構是這樣 <div class="demo"></div> 那麼我知道可以寫xpath //div[@class="demo"],但是如果我的html是 <div 

Python相關部落格和網站比較值得關注的幾個

爬蟲類:崔慶才的個人部落格 :https://cuiqingcai.com尹成的技術部落格 :https://blog.csdn.net/itcastcppFlask快速入門:http://docs.jinkan.org/docs/flask/quickstart.htmld

神級python工程師教你從網站篩選工作需求資訊,助你就業

本文以Python爬蟲、資料分析、後端、資料探勘、全棧開發、運維開發、高階開發工程師、大資料、機器學習、架構師 這10個崗位,從拉勾網上爬取了相應的職位資訊和任職要求,並通過資料分析視覺化,直觀地展示了這10個職位的平均薪資和學歷、工作經驗要求。   1、先獲取薪資和學歷、工

提取PDF檔案的文字資訊

      我們從網上下載的PDF檔案有的是加密處理過的,無法複製其中的內容,對於這類檔案的內容提取可以通過該工具實現 PDF加密       PDF檔案經過加密處理之後是無法簡單的複製的,PDF檔案的屬性也如下圖所示: 工具的使用方法       軟體的目錄結構如

教你用Inkspace提取pdf的向量圖超詳細

我只想說Inkspace真是膩害,簡直太方便了!媽媽再也不用擔心我只能用ctrl+alt+a截渣渣圖了~ 1、開啟Inkspace 2、開啟一個pdf 可確保匯出的圖絕對高清 3、將畫布縮小到需要選取的圖片的範圍: 方法一: a、選擇第二個工具 用滑鼠畫出選框,只要確保

Python小白學習之路(十四)—作用域匿名函式程式設計方法論高階函式

    吧啦吧啦內心戲 在沒有具體學作用域之前,我在之前的學習筆記中就有提到 我開始以為是自己自創的詞兒 沒想到這個詞早已經存在(手動捂臉) 真是個無知的小火鍋(不知者無罪) 我發現自己最擅長做的事情,就是給自己找個臺階,然後很快順勢滑下來 一、作用域 先來一段程式碼分析一波吧

Python小白學習之路(十五)—map()函式filter()函式reduce()函式

一、map()函式 map()是 Python 內建的高階函式 有兩個引數,第一個是接收一個函式 f(匿名函式或者自定義函式都OK啦);第二個引數是一個 可迭代物件 功能是通過把函式 f 依次作用在 第二個引數 的每個元素上,得到一個新的 list 並返回。(新的 list 元素的個數與位置與舊

Python面試題BAT

  寫在前面 今天給大家分享2018年BAT面試過程中的python的相關問題。所有的面試題和答案均來源於網路,如有侵權請及時聯絡,答案如有不正確還請各位及時指正。為面試而生希望各位都能化身offer收割機。   問題清單 Python語言特性 1.Pyt

分享《父與子的編程之旅python第二》+PDF+源碼+Warren Sande+蘇金國

英文版 粘貼 詳細 oss RoCE 其中 第二版 技術分享 arr 下載:https://pan.baidu.com/s/1hv3QvBfU7tG9WRCiSxoucA 更多資料分享:http://blog.51cto.com/14087171 《父與子的編程之旅【第二版

Python小白學習之路(二十三)—生成器補充

生成器的一些補充 接著下雞蛋和吃包子!   補充一:生成器只能遍歷一次 (總是把生成器比喻成母雞下雞蛋,需要一個下一個,首先是下出來的雞蛋不能塞回母雞肚子裡,其次是一個母雞一生只能下一定數量的雞蛋,下完了就死掉了) #通過程式來理解什麼意思 #程式一: def test():

js 劍指offer1陣列重複的數字

題目描述: 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數

計算機的二進位制問題第二更

嗯,今天突然明白了一句話你做什麼事都說明天才寫,今天才星期二還早著呢?你突然會發現時間過的好快又因為某些事而耽誤了你原有的計劃。所以做什麼事都不要託,能早準備的就早準備。 自從自己選擇了寫部落格的時候,我就要有覺悟,也要給自己一個警醒。。。你既然選擇了分享,選擇了通過這麼一個大的平臺來提高自己的計算機能力,那

NLP的self-attention自-注意力機制

隨著注意力機制的深入研究,各式各樣的attention被研究者們提出。在2017年6月google機器翻譯團隊在arXiv上放出的《Attention is all you need》論文受到了大家廣泛關注,自注意力(self-attention)機制開始成為神經網路attention的研究熱點,在

spark檢視DF的partition數目及每個partition的資料量叢集模式

1 println("--------------------"+data.rdd.getNumPartitions) // 獲取DF中partition的數目 2 val partitions = data.rdd.glom().collect() // 獲取所有data下所有的pa

oracle如何寫函式oracle技術

在oracle資料開發中函式是必不可少的。函式可以一般是可以完成某一功能而編寫的,他儲存在資料中執行也是在資料庫中,有明確的歸屬。比如:使用者A建立了一個函式,如果A不公開這個函式,那麼oracle中的其他使用者是不能看到該函式的,除非有DBA許可權的使用者的。 函式必須制定返回值,如果有沒有制定返回

Python 面向物件初級

Python 是一門面向物件的語言。本文是面向物件程式設計的初級篇,僅介紹封裝,不涉及繼承和多型。鑑於C++也是一門面向物件的語言,裡面有很多相通之處。 類的成員 類的成員可以分為三大

實現最大堆(包括插入和從堆取出元素)及第一種堆排序Java

/** *實現最大堆 *用陣列儲存 *小優化:將swap用賦值代替,先不急著交換,先複製,再移動,最後賦值 *第一種堆排序,從小到大排序 *時間複雜度為O(nlogn) *空間複雜度O(n) */ public class MaxH

乾貨 | NLP的self-attention自-注意力機制

原文連結:http://www.cnblogs.com/robert-dlut/p/863828

主機不能訪問虛擬機器的web服務解決方案

情況是這樣的:在虛擬機器visualBox裡安裝了centos7系統,並且在該系統裡運行了一個web服務,想通過宿主機或者外網來訪問該服務,總是無法訪問(虛擬機器網絡卡已配置成橋接):宿主機【win7】ip:虛擬機器【CentOS7】ip:彼此能互相ping通,虛擬機器中啟動