我试图将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:line
的17.4值有什么建议吗?
由于
答案 0 :(得分:3)
从不使用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服务器告诉您使用哪种编码页面;如果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
答案 1 :(得分:3)
这称为网络抓取,在Python中有一个非常流行的库,它被称为Beautiful Soup
:
http://www.crummy.com/software/BeautifulSoup/
如果您想使用urllib / urllib2,可以使用regular expressions
完成此操作:
http://docs.python.org/2/library/re.html
使用正则表达式,您基本上使用所需值的周围上下文作为键,然后剥离键。因此,在这种情况下,您可能会从“Wired:”匹配到下一个换行符,然后删除“Wired:”和换行符。
答案 2 :(得分:0)
您可以使用find或正则表达式逐行浏览文件以检查所需的值,也可以考虑使用scrapy检索和解析链接。