2016-12-09 3 views
1

Ich versuche, Informationen von WoS (Web of Science) -Datenbank herunterladen. Ich brauche Informationen wie Name des Artikels, Autoren, mal zitiert, Volumen und andere enter image description hereCrawling WoS mit Python

Dies ist mein Code:

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) 

Es funktioniert perfekt für den Erhalt Titel. Ich habe jedoch Probleme, die folgenden Informationen zu erhalten: Band, Ausgabe, Seiten, Datum (veröffentlicht) und Zeitangaben. Dies ist die Quelle der Webseite:

</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> 

Ich denke, dass ich Probleme habe, weil die Daten numerisch ist ... Können Sie mir bitte helfen?

+0

Hallo! Vielen Dank für Ihre Antwort. Was könnte mit HTML_Parser einfach sein ??? –

+0

Ich sehe kein Problem mit Ihrer Regex. Problem ist etwas anderes. –

+0

Ich habe keinen Zugang zu WoS. Würden Sie bitte das Bild des HTML in Ihrer Frage durch den tatsächlichen HTML-Text für die Seite ersetzen, die Sie scrappen möchten. Fügen Sie den gesamten HTML-Code hinzu, der zum Präsentieren der wiederherzustellenden Elemente verwendet wird, vom Titel bis zum Veröffentlichungsdatum (oder wo immer das Scraping enden soll). –

Antwort

0

BeautifulSoup wird für Sie viel schweres Heben tun. Regex ist normalerweise ein letzter Ausweg, wenn es um HTML geht. Es ist auch am besten, die aktuellste Version dieses Produkts zu verwenden, wie im folgenden Code zu sehen ist.

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) 

Ergebnis:

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

ich klug bin weit genug, um dies geschrieben zu haben einige Möglichkeiten, ohne zu versuchen, die fehlgeschlagen. Verwenden Sie etwas wie IDLE, das Alternativen vorschlägt und Codeschnipsel ausprobiert, um zu sehen, welche Ergebnisse sie geben?

PS: Wenn Sie wieder zu SO kommen, senden Sie bitte HTML und anderen Text als Text (nicht als Bilddateien), damit die Beantworter cut-and-paste verwenden können.

+0

Danke Bill!Ich habe das Bild für den Code bereits geändert. Ich probiere deinen Code aus und mache einige Anpassungen. Vielen Dank!! –

+0

Sie sind herzlich willkommen. Viel Glück! –

1

BeautifulSoup hat seine eigene Regex Funktionalität

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' 

Hinweis: Dies ist nur ein Beispiel, ohne Zugriff auf die eigentliche html mit

+0

Vielen Dank für Ihre Antwort, aber ich konnte es nicht schaffen zu arbeiten. Aber diese Antwort ist hilfreich für mich, neue Lösungen auszuprobieren. Vielen Dank! –

0

Ich habe es endlich geschafft! Ich schrieb dies:

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

Das die followig Ausgang gab:

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

Die erste Nummer, die ich weiß nicht, was es war, aber die Nächsten waren diejenigen, die ich brauchte. Dann iterieren ich nur die Werte:

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 

Vielen Dank für Ihre Hilfe!