我怎样才能从使用Python的HTML获得href链接?
import urllib2 website = "WEBSITE" openwebsite = urllib2.urlopen(website) html = getwebsite.read() print html
到现在为止还挺好。
但我只想从纯文本HTML链接href。 我该如何解决这个问题?
试试Beautifulsoup :
from BeautifulSoup import BeautifulSoup import urllib2 import re html_page = urllib2.urlopen("http://www.yourwebsite.com") soup = BeautifulSoup(html_page) for link in soup.findAll('a'): print link.get('href')
如果你只想要以http://
开头的链接,你应该使用:
soup.findAll('a', attrs={'href': re.compile("^http://")})
您可以使用HTMLParser模块。
代码可能看起来像这样:
from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): # Only parse the 'anchor' tag. if tag == "a": # Check the list of defined attributes. for name, value in attrs: # If href is defined, print it. if name == "href": print name, "=", value parser = MyHTMLParser() parser.feed(your_html_string)
注意: 在Python 3.0中,HTMLParser模块已经重命名为html.parser。 2to3工具将自动适应导入将源代码转换为3.0。
看看使用美丽的汤姆HTMLparsing库。
http://www.crummy.com/software/BeautifulSoup/
你会做这样的事情:
import BeautifulSoup soup = BeautifulSoup.BeautifulSoup(html) for link in soup.findAll("a"): print link.get("href")
我的答案可能比真正的大师更糟糕,但使用一些简单的math,string切片,查找和urllib,这个小脚本将创build一个包含链接元素的列表。 我testing谷歌和我的输出似乎是正确的。 希望它有帮助!
import urllib test = urllib.urlopen("http://www.google.com").read() sane = 0 needlestack = [] while sane == 0: curpos = test.find("href") if curpos >= 0: testlen = len(test) test = test[curpos:testlen] curpos = test.find('"') testlen = len(test) test = test[curpos+1:testlen] curpos = test.find('"') needle = test[0:curpos] if needle.startswith("http" or "www"): needlestack.append(needle) else: sane = 1 for item in needlestack: print item
这是@ stephen的答案的懒惰版本
from urllib.request import urlopen from itertools import chain from html.parser import HTMLParser class LinkParser(HTMLParser): def reset(self): HTMLParser.reset(self) self.links = iter([]) def handle_starttag(self, tag, attrs): if tag == 'a': for name, value in attrs: if name == 'href': self.links = chain(self.links, [value]) def gen_links(f, parser): encoding = f.headers.get_content_charset() or 'UTF-8' for line in f: parser.feed(line.decode(encoding)) yield from parser.links
像这样使用它:
>>> parser = LinkParser() >>> f = urlopen('http://stackoverflow.com/questions/3075550') >>> links = gen_links(f, parser) >>> next(links) '//stackoverflow.com'
使用BS4这个特定的任务似乎矫枉过正。
改为:
website = urllib2.urlopen('http://10.123.123.5/foo_images/Repo/') html = website.read() files = re.findall('href="(.*tgz|.*tar.gz)"', html) print sorted(x for x in (files))
我在http://www.pythonforbeginners.com/code/regular-expression-re-findall上find了这个漂亮的代码片段,对我很有帮助。;
我只testing了一个从Web文件夹中提取文件列表的scheme,该文件夹公开了files \文件夹,例如:
我得到了URL下的文件\文件夹的sorting列表