Как я могу получить href ссылки из HTML, используя Python? - PullRequest
39 голосов
/ 19 июня 2010
import urllib2

website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()

print html

Пока все хорошо.

Но я хочу только ссылки на href из простого текста HTML. Как я могу решить эту проблему?

Ответы [ 8 ]

86 голосов
/ 19 июня 2010

Попробуйте с 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://")})
28 голосов
/ 19 июня 2010

Вы можете использовать модуль 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)

Примечание: Модуль HTMLParser былпереименован в html.parser в Python 3.0.Инструмент 2to3 автоматически адаптирует импорт при конвертации ваших источников в 3.0.

12 голосов
/ 19 июня 2010

Посмотрите на использование красивой библиотеки разбора html супа.

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

Вы будете делать что-то вроде этого:

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
for link in soup.findAll("a"):
    print link.get("href")
7 голосов
/ 20 сентября 2017

Использование 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 и работает для меня довольно хорошо.

Я тестировал его только в моем сценарии извлечения списка файлов из веб-папки, в которой отображаются файлы \ папка, например:

enter image description here

и я получил отсортированный список файлов \ папок под URL

5 голосов
/ 15 февраля 2013

Мой ответ, вероятно, отстой по сравнению с реальными гуру, но с помощью некоторой простой математики, нарезки строк, поиска и urllib, этот маленький скрипт создаст список, содержащий элементы ссылок.Я проверяю Google, и мой вывод кажется правильным.Надеюсь, это поможет!

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
2 голосов
/ 01 ноября 2018

Использование запросов с BeautifulSoup и Python 3:

import requests 
from bs4 import BeautifulSoup


page = requests.get('http://www.website.com')
bs = BeautifulSoup(page.content, features='lxml')
for link in bs.findAll('a'):
    print(link.get('href'))
2 голосов
/ 15 января 2017

Вот ленивая версия ответа @ 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'
1 голос
/ 29 января 2019

Это слишком поздно, чтобы ответить, но это будет работать для последних пользователей Python:

from bs4 import BeautifulSoup
import requests 


html_page = requests.get('http://www.example.com').text

soup = BeautifulSoup(html_page, "lxml")
for link in soup.findAll('a'):
    print(link.get('href'))

Не забудьте установить " запросы " и " BeautifulSoup"пакет, а также" lxml".Используйте .text вместе с get, иначе это вызовет исключение.

" lxml " используется для удаления этого предупреждения о том, какой синтаксический анализатор будет использоваться.Вы также можете использовать « html.parser », в зависимости от того, что подходит вам.

...