2016-12-09 3 views
1

Я пытаюсь загрузить информацию из базы данных WoS (Web of Science). Мне нужна информация, такая как имя статьи, авторы, раз цитируемых, объема и других enter image description hereСканирование WoS с Python

Это мой код:

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: Когда вы снова вернетесь к SO, отправьте HTML и другой текст в виде текста (а не как файлы изображений), чтобы ответчики могли использовать вырезку и вставку.

+0

Спасибо, Билл!Я уже изменил изображение для кода. Я пробую ваш код, и я делаю некоторые корректировки. Спасибо!! –

+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 

Благодарим всех вас за помощь!

Смежные вопросы