2016-12-09 24 views
1

私はWoS(Web of Science)データベースから情報をダウンロードしようとしています。私はそのような記事、著者、引用回数、ボリュームの名前など enter image description herePythonでWoSをクロールする

などの情報を必要とする。これは私のコードです:

import sys 
from BeautifulSoup import BeautifulSoup 
import urllib 
import re 
    var = raw_input("Link WoS: ") 
    conn = urllib.urlopen(var) 
    html = conn.read() 
    soup = BeautifulSoup(html) 
    titles = re.findall('<value lang_id="">(.+?)</value>',str(soup)) 
    volume = re.findall('Volume: </span><span class="data_bold"><value>(.+?)</value>', str(soup)) 
    print(volume) 

それはタイトルを取得するための完璧な作品。しかし、私は、ボリューム、問題、ページ、日付(公開された)、引用された時間などの情報を得ることに問題があります。これはウェブページのソースです:

</span><span name="source_title_1" id="source_title_1"> 
<value> 
<span class="hitHilite">EDUCATIONAL RESEARCH</span> 
</value> 
</span>&nbsp;&nbsp;<span class="label">Volume: </span><span  class="data_bold"> 
<value>35</value> 
</span> &nbsp;&nbsp;<span class="label">Issue: </span><span class="data_bold"> 
<value>1</value> 
</span> &nbsp;&nbsp;<span class="label">Pages: </span><span class="data_bold"> 
<value>3-25</value> 
</span> &nbsp;&nbsp;<span class="label">Published: </span><span class="data_bold"> 
<value>SPR 1993</value> 
</span> 
</div> 
<div style="display: inline-block" id="links_1"> 
<nobr><span id="links_openurl_1"></span> <span id="links_full_text_1">  </span> <span id="links_doc_del_1"></span> <span id="links_patent_1"> </span> </nobr> 
</div> 
<div class="search-action-item"> 
<span id="solo_full_text_1" class="solo_full_text"></span><a  name="full_text_1" id="full_text_1" title="Full Text" class="button2link  button-ft" href="javascript:;"><span id="full_text_1" name="full_text_1" title="Full Text" class="button2 button-ft">Full Text</span></a> 
<div class="popup-full-text" id="full_text_1_menu"> 
<span id="full_text_1_links"></span> 
</div> 
</div> 
<script type="text/javascript">$("#full_text_1").hide();</script><span style="display: inline-block" class="button-abstract" id="ViewAbstract1_text"><a title="View Abstract" alt="View Abstract" onclick="return hide_show_abstract('1', 'http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif', 'http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif', 'View Abstract', 'Close Abstract');" href="javascript:;" class="button9"><img align="absmiddle" title="View Abstract" alt="View Abstract" src="http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif" id="ViewAbstract1_img">View Abstract<nobr></nobr></a></span><span style="display: none" class="button-abstract" id="HideAbstract1_text"><a title="Close Abstract" alt="Close Abstract" onclick="return hide_show_abstract('1', 'http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif', 'http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif', 'View Abstract', 'Close Abstract');" href="javascript:;" class="button9"><img align="absmiddle" title="Close Abstract" alt="Close Abstract" src="http://images.webofknowledge.com/WOKRS523R4/images/spacer.gif" id="HideAbstract1_img">Close Abstract<nobr></nobr></a></span><span style="display: none" url="http://apps.webofknowledge.com/ViewAbstract.do?product=WOS&amp;search_mode=GeneralSearch&amp;viewType=ViewAbstract&amp;qid=5&amp;SID=W1tvVEGCvoimqQujw4V&amp;page=1&amp;doc=1" id="ViewAbstract_Span1"> 
<!----></span></div><div class="search-results-data"> 
<div class="search-results-data-cite">Times Cited: <a title="View all of the articles that cite this one" href="/CitingArticles.do?product=WOS&amp;SID=W1tvVEGCvoimqQujw4V&amp;search_mode=CitingArticles&amp;parentProduct=WOS&amp;parentQid=5&amp;parentDoc=1&amp;REFID=448550&amp;excludeEventConfig=ExcludeIfFromNonInterProduct">487</a> 
<br> 

データが数値であると思います。どうすれば助けてくれますか?

+0

こんにちは!あなたの答えをありがとう。 HTML_Parserで簡単にできることは? –

+0

あなたの正規表現には何の問題もありません。問題は他にもある。 –

+0

私はWoSにアクセスできない。あなたはあなたの質問のHTMLのイメージを、掻きたいページの実際のテキストHTMLに置き換えてください。タイトルから '公開済み'(またはスクラップを終了する場所)まで、回復したいアイテムを表示するために使用されるHTMLをすべて含めます。 –

答えて

0

BeautifulSoupがあなたのために重い物を持ち上げるの多くを行いますへのアクセスを持たずに単なる一例です。正規表現は通常、HTMLが関係する最後の手段です。また、次のコードに示すように、この製品の最新バージョンを使用することをお勧めします。

HTML = '''\ 
<value> 
<span class="htmllite">EDUCATIONAL RESEARCH</span> 
</value> 
</span>&nbsp;&nbsp;<span class="label">Volume: </span><span class="data_bold"> 
<value>29</value> 
</span>&nbsp;&nbsp;<span class="label">Issue: </span><span class="data_bold"> 
<value>2</value> 
</span>&nbsp;&nbsp;<span class="label">Pages: </span><span class="data_bold"> 
<value>26-152</value> 
</span>&nbsp;&nbsp;<span class="label">Published: </span><span class="data_bold"> 
<value>JUN 1987</value> 
''' 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(HTML, "html.parser") 

items = soup.findAll('span', attrs = {'class': 'label' }) 
for item in items: 
    label = item.contents[0] 
    sibling = item.find_next_sibling('span') 
    value = sibling.select('value')[0].text 
    print (label, value) 

結果:

Volume: 29 
Issue: 2 
Pages: 26-152 
Published: JUN 1987 

は私が失敗したいくつかの可能性をしようとせずにこれを書いたために十分賢いからです。あなたはIDLEのような何かを使って代替案を提案していますか、コードの抜粋を試して、結果を確認していますか?

PS:もう一度戻ってくると、回答者がカットアンドペーストを使用できるように、HTMLやその他のテキストをテキストとして(画像ファイルではなく)投稿してください。

+0

Billありがとう!私はすでにコードの画像を変更しました。私はあなたのコードを試しています、私はいくつかの調整をしています。ありがとうございました!! –

+0

大歓迎です。運が良かった! –

1

Beautifulsoupは独自の正規表現機能

html = '<html><span>Volume: </span><span class="data_bold"><value>20</value></span></html>' 
soup = BeautifulSoup(html) 
matches = soup.findAll(text=re.compile('Volume')) 
for match in matches: 
    element = match.parent 
    #o/p: <span>Volume: </span> 
    sibling_tag = element.findNextSibling() 
    #o/p: <span class="data_bold"><value>20</value></span> 
    print sibling_tag.find('value').text 
    #o/p: u'20' 

注意があります。これは、実際のHTML

+0

あなたの答えをありがとうが、私はそれを働かせることができませんでした。しかし、この答えは私には新しい解決策を試すのに役立ちます。ありがとうございました! –

0

私はついにそれをしました!

numericValues= re.findall('<value>(.+?)</value>', str(soup)) 

これはfollowig出力を与えた:私はちょうどこれを書いた

['100-121', '35', '1', '3-25', 'SPR 1993'] 

最初の数私はそれが何であったか知らないが、次のものは私が必要なものでした。次に値を繰り返します:

i = 0 
while i < len(numericValues): 
    columnVolume.append(numericValues[i+1]) 
    columnIssue.append(numericValues[i+2]) 
    columnPages.append(numericValues[i+3]) 
    columnDate.append(numericValues[i+4][-4:]) 
    i = i + 5 

ありがとうございました!

関連する問題