【发布时间】:2011-05-28 05:38:33
【问题描述】:
我对 Python 不是很熟悉。我正在尝试从以下页面中提取艺术家姓名(开始:)):http://www.infolanka.com/miyuru_gee/art/art.html。
如何检索页面?我的两个主要担忧是;使用哪些功能以及如何过滤掉页面中无用的链接?
【问题讨论】:
我对 Python 不是很熟悉。我正在尝试从以下页面中提取艺术家姓名(开始:)):http://www.infolanka.com/miyuru_gee/art/art.html。
如何检索页面?我的两个主要担忧是;使用哪些功能以及如何过滤掉页面中无用的链接?
【问题讨论】:
使用 urllib 和 lxml.html 的示例:
import urllib
from lxml import html
url = "http://www.infolanka.com/miyuru_gee/art/art.html"
page = html.fromstring(urllib.urlopen(url).read())
for link in page.xpath("//a"):
print "Name", link.text, "URL", link.get("href")
output >>
[('Aathma Liyanage', 'athma.html'),
('Abewardhana Balasuriya', 'abewardhana.html'),
('Aelian Thilakeratne', 'aelian_thi.html'),
('Ahamed Mohideen', 'ahamed.html'),
]
【讨论】:
我认为“eyquem”方式也是我的选择,但我喜欢使用 httplib2 而不是 urllib。 urllib2 对于这项工作来说是太低级的库。
import httplib2, re
pat = re.compile('<DT><a href="[^"]+">(.+?)</a>')
http = httplib2.Http()
headers, body = http.request("http://www.infolanka.com/miyuru_gee/art/art.html")
li = pat.findall(body)
print li
【讨论】:
使用urllib2获取页面。
使用BeautifulSoup解析HTML(页面),得到你想要的!
【讨论】:
检查一下我的朋友
import urllib.request
import re
pat = re.compile('<DT><a href="[^"]+">(.+?)</a>')
url = 'http://www.infolanka.com/miyuru_gee/art/art.html'
sock = urllib.request.urlopen(url).read().decode("utf-8")
li = pat.findall(sock)
print(li)
【讨论】:
或者直接往前走:
import urllib
import re
pat = re.compile('<DT><a href="[^"]+">(.+?)</a>')
url = 'http://www.infolanka.com/miyuru_gee/art/art.html'
sock = urllib.urlopen(url)
li = pat.findall(sock.read())
sock.close()
print li
【讨论】:
尊重 robots.txt 并限制您的请求 :)
(显然 urllib2 已经按照 helpful SO post 做了)。
【讨论】:
基本上有一个函数调用:
render_template()您可以使用它轻松返回单个页面或页面列表,它会显示 所有文件都来自
your_workspace\templates。例子:
/root_dir /templates /index1.html, /index2.html /other_dir /routes.py
@app.route('/') def root_dir(): return render_template('index1.html')
@app.route(/<username>) def root_dir_with_params(username): retun render_template('index2.html', user=username)index1.html - 没有参数
<html> <body> <h1>Hello guest!</h1> <button id="getData">Get Data!</button> </body> </html>index2.html - 带参数
<html> <body> <!-- Built-it conditional functions in the framework templates in Flask --> {% if name %} <h1 style="color: red;">Hello {{ user }}!</h1> {% else %} <h1>Hello guest.</1> <button id="getData">Get Data!</button> </body> </html>
【讨论】:
适用于 Python 3.x 并使用 requests 和 bs4 的更简洁的答案。尽管在原始问题中有两个问题。一、如何获取html:
import requests
html = requests.get("http://www.infolanka.com/miyuru_gee/art/art.html").content
二、如何获取艺人名单:
import bs4
soup = bs4.BeautifulSoup(html)
artist_list = []
for i in soup.find_all("a"):
if i.parent.name == "dt":
artist_list.append(i.contents[0])
print(artist_list)
输出:
['Aathma Liyanage',
'Abewardhana Balasuriya',
'Aelian Thilakeratne',
'Ahamed Mohideen',
'Ajantha Nakandala',
'Ajith Ambalangoda',
'Ajith Ariayaratne',
'Ajith Muthukumarana',
'Ajith Paranawithana',
...]
【讨论】: