#python #regex #search #download #beautifulsoup
#python #регулярное выражение #Поиск #Скачать #beautifulsoup
Вопрос:
Недавно мне порекомендовали Beautiful Soup для проекта на python. Я читал документы на странице beautiful soup, но я не могу понять, что это за то, что я хочу сделать. У меня есть страница, на которой есть целая куча ссылок. Это каталог со ссылками, размером файла и т.д. Допустим, это выглядит так:
Parent Directory/ - Directory
game1.tar.gz 2010-May-24 06:51:39 8.2K application/octet-stream
game2.tar.gz 2010-Jun-19 09:09:34 542.4K application/octet-stream
game3.tar.gz 2011-Nov-13 11:53:01 5.5M application/octet-stream
Итак, что я хочу сделать, это указать строку поиска, допустим game2
, и я хочу, чтобы она загружалась game2.tar.gz . У меня была идея использовать RE, но я слышал, что Beautiful Soup намного лучше. Кто-нибудь может показать и объяснить, как я бы это сделал?
Комментарии:
1. Какое отношение этот вопрос имеет к BeautifulSoup. Это анализатор HTML… какова HTML-часть вашего вопроса!? О чем вы на самом деле спрашиваете???
2. …. Вопрос говорит сам за себя. Я хочу проанализировать HTML, чтобы получить все ссылки, выполнить поиск
game2
и загрузить game2.tar.gz из этого каталога.3. Используйте lxml вместо Beautiful Soup. Это еще красивее.
4. BeautifulSoup красивее
5. @Taha Jahangir Разве нет чего-то еще более мощного и более сложного, чем lxml? Это было бы великолепно использовать!
Ответ №1:
from BeautifulSoup import BeautifulSoup
import urllib2
def searchLinks(url, query_string):
f = urllib2.urlopen(url)
soup = BeautifulSoup(f, convertEntities='html')
for a in soup.findAll('a'):
if a.has_key('href'):
idx = a.contents[0].find(query_string)
if idx is not None and idx > -1:
yield a['href']
res = list(searchLinks('http://example.com', 'game2'))
print res
Комментарии:
1. Хм, выдает мне ошибку атрибута о том, что ‘list’ не имеет атрибута ‘find’
2. я обновил ответ.
contetns
это список. вместо этого вы можете использоватьa.contetns[0]
илиa.string
. В любом случае, это всего лишь набросок3. Ах, я понимаю. Есть ли какая-либо документация для такого рода вещей? Не могли бы вы также немного объяснить это, если не возражаете?
4. Официальная документация: crummy.com/software/BeautifulSoup/documentation.html
5. @Andrey Какое значение имеет URL, чтобы попробовать ваш код, пожалуйста? Если
url = 'http://pastie.org/1801547/'
и query_string равны ‘game2’ , результат будет[u'http://pastie.org/pastes/1801547/text', u'http://www.railsmachine.com']
. В этом результате нет ничего специфичного для game2 . Кстати, я все еще не понял, чего хочет OP в результате.
Ответ №2:
Ваш вопрос не очень ясен.
На основе представленных вами данных я бы подумал, что вам нужно только сделать :
content = '''Parent Directory/ - Directory
game1.tar.gz 2010-May-24 06:51:39 8.2K application/octet-stream
game2.tar.gz 2010-Jun-19 09:09:34 542.4K application/octet-stream
game3.tar.gz 2011-Nov-13 11:53:01 5.5M application/octet-stream'''
def what_dir(x, content):
for line in content.splitlines():
if x in line.split(None,1)[0]:
return line.split(None,1)[0]
.
Редактировать
Помогает ли это вам? :
import urllib
import re
sock = urllib.urlopen('http://pastie.org/pastes/1801547/reply')
content = sock.read()
sock.close()
spa = re.search('<textarea class="pastebox". ?</textarea>',content,re.DOTALL).span()
regx = re.compile('href=amp;quot;(. ?)amp;quot;amp;>\1amp;<')
print regx.findall(content,*spa)
РЕДАКТИРОВАТЬ 2
Или это то, чего ты хочешь? :
import urllib
import re
sock = urllib.urlopen('http://pastie.org/pastes/1801547/reply')
content = sock.read()
sock.close()
spa = re.search('<textarea class="pastebox". ?</textarea>',content,re.DOTALL).span()
regx = re.compile('href=amp;quot;(. ?)amp;quot;amp;>\1amp;<')
dic = dict((name.split('.')[0],'http://pastie.org/pastes/1801547/' name)
for name in regx.findall(content,*spa))
print dic
Результат
{'game3': 'http://pastie.org/pastes/1801547/game3.tar.gz',
'game2': 'http://pastie.org/pastes/1801547/game2.tar.gz',
'game1': 'http://pastie.org/pastes/1801547/game1.tar.gz'}
Комментарии:
1. Нет, нет, нет, именно так выглядит каталог на веб-странице. Фактический исходный код html выглядит как pastie.org/1801547
Ответ №3:
На YouTube есть несколько видеороликов об установке и использовании Beautiful Soup 4 для «scrape». Они довольно подробные. Я все еще медленно просматриваю их, но первый из них был установлен и запущен.
Найдите «Красивый суп» на YouTube.
Комментарии:
1. Сообщество Stack Overflow предпочитает ответы, которые непосредственно отвечают на вопрос пользователя, предоставляя конкретные примеры того, как писать код или список точных шагов, которые помогут им устранить проблему и т.д. Бесполезно просто указывать поиск по связанным видео на YouTube. Любой, кто знаком с вебом, уже знает, как это сделать.