3

我正在尝试将 html 页面中的值读入 python 脚本中的变量。我已经想出了一种使用 urllib 将页面下载到本地文件的方法,并且可以使用 bash 脚本提取值,但想在 Python 中尝试一下。

import urllib
urllib.urlretrieve('http://url.com', 'page.htm')

该页面中有这个:

<div name="mainbody" style="font-size: x-large;margin:auto;width:33;">
<b><a href="w.cgi?hsn=10543">Plateau (19:01)</a></b>
<br/> Wired: 17.4
<br/>P10 Chard: 16.7
<br/>P1 P. Gris: 17.1
<br/>P20 Pinot Noir: 15.8-
<br/>Soil Temp : Error
<br/>Rainfall: 0.2<br/>
</div>

我需要 Wired: 行中的 17.4 值

有什么建议么?

谢谢

4

3 回答 3

4

从不使用开始urlretrieve();你想要数据,而不是文件。

接下来,使用 HTML 解析器。BeautifulSoup非常适合从 HTML 中提取文本。

检索页面urllib2将是:

from urllib2 import urlopen

response = urlopen('http://url.com/')

然后将数据读入 BeautifulSoup:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.read(), from_encoding=response.headers.getparam('charset'))

那里的from_encoding部分会告诉 BeautifulSoup Web 服务器告诉你页面使用什么编码;如果网络服务器没有指定这个,BeautifulSoup 会为你做出有根据的猜测。

现在您可以搜索您的数据:

for line in soup.find('div', {'name': 'mainbody'}).stripped_strings:
    if 'Wired:' in line:
        value = float(line.partition('Wired:')[2])
        print value

对于您的演示 HTML 片段,它提供:

>>> for line in soup.find('div', {'name': 'mainbody'}).stripped_strings:
...     if 'Wired:' in line:
...         value = float(line.partition('Wired:')[2])
...         print value
... 
17.4
于 2013-10-04T07:05:23.477 回答
4

这称为网络抓取,在 Python 中有一个非常流行的库来执行此操作,它被称为Beautiful Soup

http://www.crummy.com/software/BeautifulSoup/

如果你想用 urllib/urllib2 来做,你可以使用regular expressions

http://docs.python.org/2/library/re.html

使用正则表达式,您基本上使用所需值的周围上下文作为键,然后将键剥离。因此,在这种情况下,您可能会从“Wired:”匹配到下一个换行符,然后去掉“Wired:”和换行符。

于 2013-10-04T07:13:36.340 回答
0

您可以使用 find 或正则表达式逐行运行文件以检查您需要的值,或者您可以考虑使用 scrapy 检索和解析链接。

于 2013-10-04T07:05:05.380 回答