如何用urllib.request读取一行

问题描述 投票:0回答:2

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

python python-3.x urllib
2个回答
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'

Suggestions

  1. 使用requests代替urllib的http请求

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

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

请求和正则表达式示例

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

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。

© www.soinside.com 2019 - 2024. All rights reserved.