如何用 urllib.request 读一行

How to read one line with urllib.request

我正在尝试使用 urllib.request 模块读取网页的一行。

我试过readline()readlines()read(),但我不能让它只读一行。

我该怎么做?

我只是想阅读 python.org 的第 581 行。

我现在的脚本是:

import urllib.request

get_page = urllib.request.urlopen('https://www.python.org')
x = int('581')
get_ver = get_page.readline(x)

print("Currant Versions Are: ", get_ver)

结果是:

Currant Versions Are:  b'<!doctype html>\n'

即使我改变数字,结果总是一样。

那么我如何只读第 581 行?

您正在阅读最多 限制 574 字节,而不是第 574 行。

这样你可以获得 n-th 行号,同时尽量减少从服务器读取的数据量(如果你需要更好的性能,请查看 http range request):

import urllib.request
from itertools import islice

get_page = urllib.request.urlopen('https://www.python.org')

def get_nth_line(resp, n):
    i = 1
    while i < n:
        resp.readline()
        i += 1
    return resp.readline()

print(get_nth_line(get_page, 574))

输出:

b'<p>Latest: <a href="/downloads/release/python-362/">Python 3.6.2</a> - <a href="/downloads/release/python-2713/">Python 2.7.13</a></p>\n'

建议

  1. 对 http 请求使用 requests 而不是 urllib

requests.get('http://www.python.org').read()

  1. 使用正则表达式或bs4解析和提取python
  2. 的版本

请求和正则表达式示例

import re, requests

resp = requests.get('http://www.python.org')
# regex might need adjustments
ver_regex = re.compile(r'<a href\="/downloads/release/python\-2\d+/">(.*?)</a>')
py2_ver = ver_regex.search(resp.text).group(1)
print(py2_ver)

输出:

Python 2.7.13

这是使用 readlines() 的一种方法。

这是工作脚本:

import urllib.request

get_page = urllib.request.urlopen('https://www.python.org')
get_ver = get_page.readlines()

print("Currant Versions Are: ", get_ver[580])

它不起作用,因为 readlines() 值必须是一个列表。另外它是 580 而不是 581 因为第一行算作 0.