【问题标题】:How do I read an HTML file in Python from multiple URLs?如何从多个 URL 读取 Python 中的 HTML 文件?
【发布时间】:2026-02-11 17:40:01
【问题描述】:

我正在编写一个脚本,它将根据以下内容从基本 HTML 页面中提取数据:

URL 中的第一个参数在 -90.0 和 90.0(含)之间浮动,第二组数字在 -180.0 和 180.0(含)之间。该 URL 会将您定向到一个页面,该页面以单个数字作为页面正文(例如,http://jawbone-virality.herokuapp.com/scanner/desert/-89.7/131.56/)。我需要在所有附加到 URL 的页面之间找到​​最大的病毒式传播数。

所以,现在我让它打印第一个和第二个数字,以及正文中的数字(我们称之为病毒式传播)。它只是打印到控制台,每次我尝试将它写入一个文件时它都会对我产生影响并且我得到错误。任何提示或我遗漏的任何东西?我对 Python 很陌生,所以我不确定我是否遗漏了什么。

import shutil
import os
import time
import datetime
import math
import urllib
from array import array
myFile = open('test.html','w')
m = 5
for x in range(-900,900,1):
    for y in range(-1800,1800,1):
        filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/'+str(x/10)+'/'+str(y/10)+'/')
        print 'Planet Desert: (' + str(x/10) +','+ str(y/10) + '), Virality: ' + filehandle.readlines()[0] #lines
        #myFile.write('Planet Desert: (' + str(x/10) +','+ str(y/10) + '), Virality: ' + filehandle.readlines()[0])
myFile.close()
filehandle.close()

谢谢!

【问题讨论】:

  • 你遇到了什么错误?
  • 有点跑题了,但是这段代码会发出大约 650 万个 HTTP 请求……这就是你真正想要的吗!?如果是这样,您最好使用 Queue 的多线程方法 - docs.python.org/2/library/queue.html#module-Queue
  • 也可以使用Scrapy 来解决这个问题(我的经验已经反映)。
  • 为什么myFile.readline()(单数)可以使用myFile.readlines()[0]
  • @Aufziehvogel 这正是我想要的。有没有更容易安装的东西??

标签: python html


【解决方案1】:

写入文件时,之前的print语句还有吗?那么当您调用readlines() 时,您的问题将是Python advances the file pointer to the end of the file。因此,对readlines() 的第二次调用将返回一个空列表,而您对第一个元素的访问将产生一个IndexError

查看此示例执行:

filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/')
print(filehandle.readlines())  # prints ['5']
print(filehandle.readlines())  # prints []

解决方法是将结果保存到变量中,然后使用它。

filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/')
res = filehandle.readlines()[0]
print(res)  # prints 5
print(res)  # prints 5

然而,正如 cmets 中已经指出的,这里不需要调用readlines(),因为看起来网站的格式只是一个纯整数。所以线的概念在那里并不真正存在,或者至少没有提供更多信息。所以让我们放弃它以换取更简单的功能read()(这里甚至不需要readline())。

filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/')
res = filehandle.read()
print(res)  # prints 5

您的源代码中还有另一个问题。根据您对urllib.urlopen() 的使用,我可以得出,您使用的是 Python 2。但是,在 Python 2 中,整数除法的处理方式与 C 或 Java 中一样,它们会导致整数四舍五入。因此,您将调用http://jawbone-virality.herokuapp.com/scanner/desert/-90/-180/ 十次。

这可以通过以下任一方式解决:

希望我能帮上忙。

【讨论】: