Красивый вопрос о супе

#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. Любой, кто знаком с вебом, уже знает, как это сделать.