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

时间:2019-01-21 21:54:42

标签: python urllib2

我正在从事一个项目,其中一个步骤包括获取一个随机单词,稍后我将使用它。当我尝试抓住随机词时,它会给我'<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 :(得分:1)

因此,网站的工作方式是:在跨度框中不带任何单词的站点发送给您,然后通过JavaScript对其进行编辑;这就是为什么您得到一个没有任何内容的跨接盒的原因。

但是,由于您尝试获取单词,所以我绝对建议您使用其他方法来获取单词,而不是将单词从页面上刮掉,您只需向{{1}发送POST请求}没有身体的人,就会收到回应。

您使用的是Python 2,但在Python 3中(例如,为了让我可以展示此作品),您可以这样做:

# Define the implied lower bound and the maximum upper bound.
$lowerBound = 1
$maxUpperBound = 18

# Prompt the user for the upper bound of the range, with validation,
# until a valid value is entered.
do {
  $userInput = Read-Host -Prompt "How many servers are being tested?"
  if (
    ($upperBound = $userInput -as [int]) -and 
    ($upperBound -ge $lowerBound -and $upperBound -le $maxUpperBound)
  ) {
    break # valid value entered, exit loop.
  } else {
    # Invalid input: Warn, and prompt again.
    Write-Warning "'$userInput' is either not a number or is outside the expected range of [$lowerBound,$maxUpperBound]."
  }
} while ($true)

# Create the array of indices based on user input.
1..$upperBound

您也可以在Python 2中使用urllib进行类似的操作。

答案 1 :(得分:1)

使用JavaScript将单词添加到页面。我们可以通过查看请求中返回的实际HTML并将其与我们在Web浏览器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,如果我们查看该页面正在发出的网络请求,那么可以看到它通过向http://watchout4snakes.com/wo4snakes/Random/RandomWord发出POST请求来检索随机单词。直接向类似requests之类的库(在标准库文档here中推荐)发出请求,看起来像:

import requests

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

print(requests.post(url).text)