использование вывода из beautifulsoup в python

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Всем привет, я использую beautifulsoup (после двухдневной безуспешной борьбы со scrapy) для очистки данных starcraft 2 league, однако я сталкиваюсь с проблемой.

У меня есть эта таблица, с результатом которой я хочу получить строковое содержимое всех тегов, которые я делаю следующим образом:

 from BeautifulSoup import *
from urllib import urlopen

def parseWithSoup(url):
    print "Reading:" , url
    html = urlopen(url).read().lower()
    bs = BeautifulSoup(html)
    table = bs.find(lambda tag: tag.name=='table' and tag.has_key('id') and tag['id']=="tblt_table") 
    rows = table.findAll(lambda tag: tag.name=='tr')

    rows.pop(0) #first row is header
    for row in rows:
        tags = row.findAll(lambda tag: tag.name=='a')
        content = []
        for tagcontent in tags:
            content.append(tagcontent.string)
        print content

if __name__ == '__main__':
    content = "http://www.teamliquid.net/tlpd/sc2-international/games#tblt-5018-1-1-DESC"
    metSoup = parseWithSoup(content)
  

однако вывод выглядит следующим образом:

 [u' ', u'gadget show live i..', u'crevasse', u'naniwa', u'socke']
[u' ', u'gadget show live i..', u'metalopolis 1.1', u'naniwa', u'socke']
[u' ', u'gadget show live i..', u'shakuras plateau 2.0', u'socke', u'select']
etc...
  

Мой вопрос: откуда берется u » (это из unicode?) и как я могу это удалить? Мне просто нужны строки, которые находятся в u «…

Комментарии:

1. >>> l = [u ‘ ‘, u’гаджет показывает live i ..’, u’crevasse’, u’naniwa’, u’socke’] >>> l[1] u’гаджет показывает live i ..’. >>> print l[1] #по-прежнему в юникоде, но при печати u гаджет не показывает live i..

Ответ №1:

u Означает строку в Юникоде. Это ничего не меняет для вас как программиста, и вы должны просто игнорировать это. Обрабатывайте их как обычные строки. Вы действительно хотите, чтобы этот u был там.

Имейте в виду, что все выходные данные Beautifulsoup в формате Unicode. Это хорошо, потому что, если вы столкнетесь с любыми символами Юникода при очистке, у вас не возникнет никаких проблем. Если вы действительно хотите избавиться от u , (я не рекомендую это), вы можете использовать decode() метод строки unicode.

Комментарии:

1. Просто действительно любопытно: почему бы вам не порекомендовать это? В конечном итоге я хочу вывести это в файл .csv, я не хочу, чтобы там были u (или об этом позаботятся автоматически?)

2. @Javaaa это всего лишь часть представления, когда Python показывает вам структуру данных. На самом деле это не отображается, если вы выводите в стандартный вывод или файл.

3. Вы не можете преобразовать строки Unicode в стандартные строки с помощью str(). Это типичный американский совет, когда люди знают только ASCII. Для правильного преобразования строк unicode в строку вам необходимо использовать метод some_unicode_string.decode(кодирование). Вызов str() для строки Unicode никогда не подходит.

4. @RestRisiko пожалуйста, не истолковывайте мое незнание unicode как какой-то расизм.

5. Я был озадачен этим! Спасибо за ответ.

Ответ №2:

То, что вы видите, — это строки Python в юникоде.

Проверьте документацию по Python

http://docs.python.org/howto/unicode.html

для того, чтобы корректно работать со строками в юникоде.

Комментарии:

1. теперь все это имеет большой смысл, была такая же проблема в другом проекте с использованием tweepy, спасибо!