Отсутствует текст после очистки сайта с помощью BeautifulSoup - PullRequest
0 голосов
/ 19 октября 2018

Я пишу скрипт на python, чтобы получить количество запросов на получение, сгенерированных конкретным пользователем во время текущего события hactoberfest.Вот ссылка на официальный сайт hacktoberfest .
Вот мой код:

url= 'https://hacktoberfest.digitalocean.com/stats/user'
import urllib.request
from bs4 import BeautifulSoup
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
soup = BeautifulSoup(html, 'html.parser')
name_box = soup.find('div', attrs={'class': 'userstats--progress'})
print(name_box)

Где «пользователь» в первой строке кода должен быть заменен на пользовательский githubдескриптор (например, BAJUKA).

Ниже приведен HTML-тег, который я собираюсь очистить:

<div class="userstats--progress">
        <p>
          Progress (<span data-js="userPRCount">5</span>/5)
        </p>
          <div class="ProgressBar ProgressBar--three u-mb--regular ProgressBar--full" data-js="progressBar"></div>
      </div>

Это то, что я получаю после запуска кода:

<div class="userstats--progress">
<p>
          Progress (<span data-js="userPRCount"></span>/5)
        </p>
<div class="ProgressBar ProgressBar--three u-mb--regular" data-js="progressBar"></div>
</div>

Разница заключается в том, что в третьей строке пропущен номер запроса на удаление (т. Е. В теге span 5 отсутствует)
Это вопросы, которые я хочу задать:
1Почему нет?запросов извлечения (т. е. 5 в данном случае) отсутствуют в очищенных строках?
2.Как я могу решить эту проблему?То есть получить нет.запросов на получение успешно.

1 Ответ

0 голосов
/ 19 октября 2018

Данные, которые вы ищете, находятся не в исходных данных, которые отправляет сервер hacktober, а в Beautiful Soup загружает и анализирует их;он вставляется в HTML с помощью кода Javascript, который запускается на этой странице в вашем браузере после загрузки исходных данных.

Если вы используете эту команду оболочки для загрузки данных, которые фактически служат страницей, вывидите, что тег span, на который вы смотрите, начинается с пустого значения:

curl -s 'https://hacktoberfest.digitalocean.com/stats/BAJUKA' | grep -3 Progress

Какой javascript заполняет этот тег?Ну, это минимизировано, поэтому очень трудно разобрать, что происходит.Вы можете найти его в самом низу исходных данных, здесь:

curl -s 'https://hacktoberfest.digitalocean.com/stats/BAJUKA' | grep -3 "script src=" | tail -n5

, который при запуске выдает:

<script src="https://go.digitalocean.com/js/forms2/js/forms2.min.js"></script>
<script src="/assets/application-134859a20456d7d32be9ea1bc32779e87cad0963355b5372df99a0cff784b7f0.js"></script>

Этот безумно выглядящий исходный URL - это миниатюрный фрагмент Javascript, что означает, что он автоматически сокращается, а также означает, что он почти не читается.Но если вы перейдете на эту страницу. и перейдете на страницу вниз, вы увидите искаженный Javascript, который вы можете попробовать и декодировать.

Я заметил этот бит:

var d="2018-09-30T10%3A00%3A00%2B00%3A00",f="2018-11-01T12%3A00%3A00%2B00%3A00";$.getJSON("https://api.github.com/search/issues?q=-label:invalid+created:"+d+".."+f+"+type:pr+is:public+author:"+t+"&per_page=300"

Я думаю, что он получает данные для заполнения этого DIV.Если вы загрузите и проанализируете этот URL, я думаю, вы найдете нужные данные.Вам нужно будет указать даты этого поиска и автора.Удачи!

...