如何用urllib.request读取一行

时间:2017-08-21 19:35:57

标签: python python-3.x urllib

我正在尝试使用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行?

2 个答案:

答案 0 :(得分:3)

您正在读取限制的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. 使用requests代替urllib
  2. 进行http请求

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

    1. 使用正则表达式或bs4解析和提取python的版本
    2. 请求&amp;正则表达式示例

      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
      

答案 1 :(得分:0)

这是使用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。