Comment puis-je obtenir des liens href à partir de HTML en utilisant Python?
import urllib2
website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()
print html
pour l'instant tout va bien.
mais je ne veux que les liens href du texte HTML. Comment puis-je résoudre ce problème?
6 réponses
Essayez avec 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')
dans le cas où vous voulez juste des liens commençant par http://
, vous devez utiliser:
soup.findAll('a', attrs={'href': re.compile("^http://")})
vous pouvez utiliser le module HTMLParser .
le code ressemblerait probablement à quelque chose comme ceci:
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)
Note: le module HTMLParser a été renommé en html.parser en Python 3.0. L'outil 2to3 adaptera automatiquement les importations lors de la conversion de vos sources à 3.0.
regardez l'utilisation de la bibliothèque de parsing belle soupe html.
http://www.crummy.com/software/BeautifulSoup /
vous allez faire quelque chose comme ça:
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
for link in soup.findAll("a"):
print link.get("href")
ma réponse craint probablement par rapport aux vrais gourous là-bas, mais en utilisant quelques mathématiques simples, le tranchage de chaîne, trouver et urllib, ce petit script va créer une liste contenant des éléments de lien. Je teste google et ma sortie semble correcte. Espérons que cela aide!
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
utiliser BS4 pour cette tâche spécifique semble exagéré.
Essayez plutôt:
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))
j'ai trouvé ce joli morceau de code sur http://www.pythonforbeginners.com/code/regular-expression-re-findall et fonctionne très bien pour moi.
Je l'ai testé seulement sur mon scénario d'extraire une liste de fichiers à partir d'un dossier web qui expose les fichiers\folder dedans, par exemple:
et j'ai eu une liste triée des dossiers\dossiers sous L'URL
Voici une version paresseuse de la réponse de @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
utilisez - le comme ceci:
>>> parser = LinkParser()
>>> f = urlopen('http://stackoverflow.com/questions/3075550')
>>> links = gen_links(f, parser)
>>> next(links)
'//stackoverflow.com'