преобразование HTML в текст с использованием языка Python - PullRequest
3 голосов
/ 29 августа 2010
import urllib2

from BeautifulSoup import *

resp = urllib2.urlopen("file:///D:/sample.html")

rawhtml = resp.read()

resp.close()
print rawhtml

Я использую этот код для получения текста из HTML-документа, но он также дает мне HTML-код. Что я должен сделать, чтобы получить только текст из HTML-документа?

Ответы [ 5 ]

4 голосов
/ 29 августа 2010

Обратите внимание, что ваш пример не использует Beautifulsoup.См. doc и следуйте примерам.

В следующем примере, взятом из ссылки выше, поиск soup для <td> элементов.

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen("http://www.icc-ccs.org/prc/piracyreport.php")
soup = BeautifulSoup(page)
for incident in soup('td', width="90%"):
    where, linebreak, what = incident.contents[:3]
    print where.strip()
    print what.strip()
    print
3 голосов
/ 29 августа 2010

В самой документации модуля есть способ извлечь все строки из документа.@ http://www.crummy.com/software/BeautifulSoup/

from BeautifulSoup import BeautifulSoup
import urllib2

resp = urllib2.urlopen("http://www.google.com")
rawhtml = resp.read()
soup = BeautifulSoup(rawhtml)

all_strings = [e for e in soup.recursiveChildGenerator() 
         if isinstance(e,unicode)])
print all_strings
1 голос
/ 29 августа 2010

Существует также html2text .

Другой вариант - передать его по каналу "lynx -dump"

1 голос
/ 29 августа 2010

Адаптировано из коллективного интеллекта Тони Сегарана (стр. 60):

def gettextonly(soup):
    v=soup.string
    if v == None:
        c=soup.contents
        resulttext=''
        for t in c:
            subtext=gettextonly(t)
            resulttext+=subtext+'\n'
        return resulttext
    else:
        return v.strip()

Пример использования:

>>>from BeautifulSoup import BeautifulSoup

>>>doc = ['<html><head><title>Page title</title></head>',
       '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
       '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
       '</html>']
>>>''.join(doc)
'<html><head><title>Page title</title></head><body><p id="firstpara" align="center">
This is paragraph <b>one</b>.<p id="secondpara" align="blah">This is
paragraph<b>two</b>.</html>'

>>>soup = BeautifulSoup(''.join(doc))
>>>gettextonly(soup)
u'Page title\n\nThis is paragraph\none\n.\n\nThis is paragraph\ntwo\n.\n\n\n\n'

Обратите внимание, что в результате получается одна строка, в которой текст изнутри отличаетсятеги, разделенные символами новой строки (\ n).

Если вы хотите извлечь все слова текста в виде списка слов, вы можете использовать следующую функцию, также адаптированную из Tony Segaran's Programming Collective Intelligence.(стр. 61):

import re
def separatewords(text):
    splitter=re.compile('\\W*')
    return [s.lower() for s in splitter.split(text) if s!='']

Пример использования:

>>>separatewords(gettextonly(soup))
[u'page', u'title', u'this', u'is', u'paragraph', u'one', u'this', u'is', 
u'paragraph', u'two']
0 голосов
/ 03 июля 2011

Я использовал пакет html2text с красивым супом, чтобы исправить некоторые проблемы с пакетом. например html2text не понимает литералы auml или ouml, только Auml и Ouml с заглавной первой буквой.

unicode_coded_entities_html = unicode(BeautifulStoneSoup(html,convertEntities=BeautifulStoneSoup.HTML_ENTITIES))
text = html2text.html2text(unicode_coded_entities_html)

html2text выполняет преобразование в синтаксис текста уценки, поэтому преобразованный текст может быть преобразован в формат html (конечно, некоторая информация будет потеряна при преобразовании).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...