Когда я беру html с веб-сайта, использующего urllib2, внутренний html становится пустым.Кто-нибудь знает почему? - PullRequest
0 голосов
/ 22 января 2019

Я работаю над проектом, и один из шагов включает получение случайного слова, которое я буду использовать позже.Когда я пытаюсь схватить случайное слово, оно дает мне «<span id="result"></span>», но, как вы видите, внутри нет слова.

Код:

import urllib2
from bs4 import BeautifulSoup

quote_page = 'http://watchout4snakes.com/wo4snakes/Random/RandomWord'

page = urllib2.urlopen(quote_page)

soup = BeautifulSoup(page, 'html.parser')

name_box = soup.find("span", {"id": "result"})

print name_box

name = name_box.text.strip() 

print name

Я думаю, что, возможно, может потребоваться дождаться появления слова, но я не уверен, как это сделать.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Это слово добавляется на страницу с помощью JavaScript.Мы можем убедиться в этом, посмотрев фактический HTML-код, возвращаемый в запросе, и сравнив его с тем, что мы видим в инспекторе DOM веб-браузера.Есть два варианта:

  1. Использовать библиотеку, способную выполнить JavaScript и дать вам полученный HTML
  2. Попробуйте другой подход, не требующий поддержки JavaScript

Для 1 мы можем использовать что-то вроде requests_html.Это будет выглядеть так:

from requests_html import HTMLSession

url = 'http://watchout4snakes.com/wo4snakes/Random/RandomWord'

session = HTMLSession()
r = session.get(url)

# Some sleep required since the default of 0.2 isn't long enough.
r.html.render(sleep=0.5)
print(r.html.find('#result', first=True).text)

Для 2, если мы посмотрим на сетевые запросы, которые делает страница, то мы увидим, что она получает случайные слова, отправив запрос POST на http://watchout4snakes.com/wo4snakes/Random/RandomWord.Выполнение прямого запроса с библиотекой, такой как requests (рекомендуется в документации стандартной библиотеки здесь ), выглядит следующим образом:

import requests

url = 'http://watchout4snakes.com/wo4snakes/Random/RandomWord'

print(requests.post(url).text)
0 голосов
/ 22 января 2019

Таким образом, сайт работает так, что он отправляет вам сайт без слов в поле span и редактирует его позже через JavaScript; вот почему вы получаете коробку с пустым пространством внутри.

Однако, так как вы пытаетесь получить слово, я определенно предлагаю вам использовать другой метод для получения слова, а не вырезать слово со страницы, вы можете просто отправить запрос POST на http://watchout4snakes.com/wo4snakes/Random/RandomWord с нет тела и получить слово в ответ.

Вы используете Python 2, но в Python 3 (например, чтобы я мог показать, что это работает) вы можете сделать:

>>> import requests
>>> r = requests.post('http://watchout4snakes.com/wo4snakes/Random/RandomWord')
>>> print(r.text)
doom

Вы можете сделать нечто подобное, используя urllib и в Python 2.

...