当我使用 urllib2 从网站获取 html 时,内部 html 是空的。有人知道为什么吗?

When I take html from a website using urllib2, the inner html is empty. Anyone know why?

我正在做一个项目,其中一个步骤包括获取一个我稍后会用到的随机词。当我尝试抓取随机单词时,它给了我“<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

我在想,也许它可能需要等待一个词出现,但我不确定该怎么做。

所以该站点的工作方式是它向您发送跨度框中没有单词的站点,然后通过 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

您也可以使用 Python 2 中的 urllib 做类似的事情。

这个词是使用 JavaScript 添加到页面的。我们可以通过查看请求中返回的实际 HTML 并将其与我们在 Web 浏览器 DOM 检查器中看到的内容进行比较来验证这一点。有两种选择:

  1. 使用能够执行 JavaScript 并为您提供结果 HTML
  2. 的库
  3. 尝试一种不需要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,如果我们查看页面正在发出的网络请求,那么我们可以看到它通过向 http://watchout4snakes.com/wo4snakes/Random/RandomWord 发出 POST 请求来检索随机词。使用像 requests (recommended in the standard library documentation here) 这样的库发出直接请求看起来像:

import requests

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

print(requests.post(url).text)