Извлечение читаемого текста из HTML с использованием Python? - PullRequest
4 голосов
/ 03 июля 2010

Мне известны такие утилиты, как html2text, BeautifulSoup и т. Д., Но проблема в том, что они также извлекают javascript и добавляют его в текст, что затрудняет их разделение.

htmlDom = BeautifulSoup(webPage)

htmlDom.findAll(text=True)

поочередно

from stripogram import html2text
extract = html2text(webPage)

Оба из них также извлекают весь javascript на странице, это нежелательно.

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

Ответы [ 4 ]

5 голосов
/ 03 июля 2010

Если вы хотите избежать извлечения содержимого тегов script с помощью BeautifulSoup,

nonscripttags = htmlDom.findAll(lambda t: t.name != 'script', recursive=False)

сделает это за вас, получив непосредственные дочерние элементы root, которые не являются тегами (отдельный htmlDom.findAll(recursive=False, text=True) получит строки, которые являются непосредственными потомками корня).Вы должны сделать это рекурсивно;например, в качестве генератора:

def nonScript(tag):
    return tag.name != 'script'

def getStrings(root):
   for s in root.childGenerator():
     if hasattr(s, 'name'):    # then it's a tag
       if s.name == 'script':  # skip it!
         continue
       for x in getStrings(s): yield x
     else:                     # it's a string!
       yield s

Я использую childGenerator (вместо findAll), чтобы я мог просто привести всех детей в порядок и выполнить свою собственную фильтрацию.

0 голосов
/ 03 июля 2010

вы можете удалить теги сценария в красивом супе, что-то вроде:

for script in soup("script"):
    script.extract()

Снятие элементов

0 голосов
/ 03 июля 2010

Используя BeautifulSoup, что-то вроде этого:

def _extract_text(t):
    if not t:
        return ""
    if isinstance(t, (unicode, str)):
        return " ".join(filter(None, t.replace("\n", " ").split(" ")))
    if t.name.lower() == "br": return "\n"
    if t.name.lower() == "script": return "\n"
    return "".join(extract_text(c) for c in t)
def extract_text(t):
    return '\n'.join(x.strip() for x in _extract_text(t).split('\n'))
print extract_text(htmlDom)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...