Получение информации внутри функции скрипта с веб-страницы - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь получить информацию с https://rosettacode.org/wiki/Category:Rascal и подобных страниц. Информация, которая меня интересует, находится в правом верхнем углу страницы в окне со сведениями о языке, таком как execution method, garbage collected и т. Д. Эта информация содержится в следующей строке в html-источнике страницы:

<script type="8b5f853f8b614ed469e51514-">window.RLQ = window.RLQ || []; window.RLQ.push( function () {
mw.config.set({"wgCanonicalNamespace":"Category","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":14,"wgPageName":"Category:Rascal","wgTitle":"Rascal","wgCurRevisionId":137957,"wgRevisionId":137957,"wgArticleId":11663,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],

"wgCategories":["Execution method/Interpreted","Garbage collection/Yes","Parameter passing/By value","Typing/Safe","Typing/Strong","Typing/Expression/Partially implicit","Typing/Checking/Dynamic","Impl needed","Programming Languages"],

"wgBreakFrames":!1,"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"Category:Rascal"
,"wgRelevantArticleId":11663,"wgIsProbablyEditable":!0,"wgRestrictionEdit":[],"wgRestrictionMove":[],"sfgAutocompleteValues":[],"sfgAutocompleteOnAllChars":!1,"sfgFieldProperties":[],"sfgDependentFields":[],"sfgShowOnSelect":[],"sfgScriptPath":"/mw/extensions/SemanticForms","sdgDownArrowImage":"/mw/extensions/SemanticDrilldown/skins/down-arrow.png","sdgRightArrowImage":"/mw/extensions/SemanticDrilldown/skins/right-arrow.png"});mw.loader.implement("user.options",function($,jQuery){mw.user.options.set({"variant":"en"});});mw.loader.implement("user.tokens",function($,jQuery){mw.user.tokens.set({"editToken":"+\\","patrolToken":"+\\","watchToken":"+\\"});});mw.loader.load(["ext.smw.style","ext.smw.tooltips","mediawiki.page.startup","mediawiki.legacy.wikibits"]);
} );</script>

Основная часть находится в "wgCategories" (показано в середине кода выше).

У меня есть следующий код для получения страницы:

import requests, sys
lang_url = 'https://rosettacode.org/wiki/Category:Rascal'
rg = requests.get(lang_url)
if rg is None: 
   print("Could not obtain web page.")
   sys.exit()
else: print("length of obtained page:", len(rg.text) )

from bs4 import BeautifulSoup

Какую функцию BeautifulSoup я могу использовать для получения этой информации?

Редактировать: я проверил BeautifulSoup - я могу получить title, para по p и ссылки по a и a['href'] и т. Д., Но я не могу найти метод для поиска и поиска внутри скрипт function.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Это не Beautifulsoup, но вы можете использовать re для этого, так как html-анализ вернет весь блок скрипта.

import re
wgcontent = re.findall('wgCategories":\[(.+?)]', rg.text)[0].replace('"', '').split(',')

это вернет список:

Execution method/Interpreted
Garbage collection/Yes
Parameter passing/By value
Typing/Safe
Typing/Strong
Typing/Expression/Partially implicit
Typing/Checking/Dynamic
Impl needed
Programming Languages
0 голосов
/ 29 июня 2018

Вы можете передать content объекта requests в конструктор BeautifulSoup, указав HTML-анализатор BeautifulSoup, html.parser, чтобы получить его в правильном формате. Затем вы можете использовать функцию BeautifulSoup find_all(), которая имеет параметр тега элемента и возвращает список. Смотрите ниже:

import requests
r = requests.get('https://rosettacode.org/wiki/Category:Rascal')

from bs4 import BeautifulSoup as bs
soup = bs(r.content, 'html.parser')
print(soup.find_all('script'))

Другим вариантом является использование regex, если вы любите подобные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...