如何用 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'
建议
- 对 http 请求使用 requests 而不是
urllib
requests.get('http://www.python.org').read()
- 使用正则表达式或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
这是使用 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.
我正在尝试使用 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'
建议
- 对 http 请求使用 requests 而不是
urllib
requests.get('http://www.python.org').read()
- 使用正则表达式或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
这是使用 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.