import urllib2
website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()
print html
Пока все хорошо.
Но я хочу только ссылки href из простого текстового HTML. Как я могу решить эту проблему?
import urllib2
website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()
print html
Пока все хорошо.
Но я хочу только ссылки href из простого текстового HTML. Как я могу решить эту проблему?
Попробуйте 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)
Примечание. Модуль HTMLParser был переименован в html.parser в Python 3.0. Инструмент 2to3 автоматически адаптирует импорт при преобразовании ваших источников в 3.0.
Посмотрите на использование красивой библиотеки анализа синтаксиса html.
http://www.crummy.com/software/BeautifulSoup/
Вы сделаете что-то вроде этого:
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
for link in soup.findAll("a"):
print link.get("href")
Использование 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 и работает для меня довольно хорошо.
Я протестировал его только в моем сценарии извлечения списка файлов из веб-папки, в которой отображаются файлы\папка, например:
и я получил отсортированный список файлов\папок под URL
Мой ответ, вероятно, сосет по сравнению с реальными гуру, но с помощью простой математики, нарезки строк, find и urllib этот маленький script создаст список, содержащий элементы ссылок. Я тестирую 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
Использование запросов с 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'))
Здесь ленивая версия @stephen answer
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'
Это слишком поздно, чтобы ответить, но это будет работать для последних пользователей 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 ", в зависимости от того, что подходит вам.
Этот ответ похож на другие с requests
и BeautifulSoup
, но с использованием понимания списка.
Поскольку find_all()
является самым популярным методом в API поиска Beautiful Soup, вы можете использовать soup("a")
как ярлык soup.findAll("a")
и использовать понимание списка:
import requests
from bs4 import BeautifulSoup
URL = "http://www.yourwebsite.com"
page = requests.get(URL)
soup = BeautifulSoup(page.content, features='lxml')
# Find links
all_links = [link.get("href") for link in soup("a")]
# Only external links
ext_links = [link.get("href") for link in soup("a") if "http" in link.get("href")]
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#calling-a-tag-is-like-calling-find-all