Могу ли я сегментировать документ в BeautifulSoup, прежде чем преобразовать его в текст, основываясь на моем анализе документа? - PullRequest
0 голосов
/ 15 мая 2009

У меня есть несколько html-файлов, которые я хочу преобразовать в текст. Я поиграл с BeautifulSoup и добился некоторого прогресса в понимании того, как использовать инструкции, и могу представить HTML и получить обратно текст.

Однако в моих файлах много текста, отформатированного с использованием табличных структур. Например, у меня может быть абзац текста, который находится в теге td в наборе тегов таблицы

<table>
<td> here is some really useful information and there might be other markup tags but
     this information is really textual in my eyes-I want to preserve it
 </td>
</table>

И затем есть «классические таблицы», которые содержат данные в теле таблицы.

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

Я выяснил, как получить характеристики моих таблиц, например, чтобы получить количество столбцов в каждой таблице:

numbCols=[]
for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
        rows.append(columns)
    numbCols.append(rows)

так что я могу работать с numbCols и использовать длину каждого элемента в списке и значения каждого элемента в списке, чтобы анализировать характеристики моих таблиц и определять те, которые я хочу сохранить или отбросить.

Я не вижу элегантного способа использования этой информации с BeautifulSoup для получения текста. Я думаю, что я пытаюсь получить, предположим, что я анализирую numbCols и решаю, что из десяти таблиц в конкретном документе я хочу исключить таблицы 2, 4, 6 и 9. Таким образом, часть HTML-документа включает в себя все, кроме столы. Как я могу разделить мой суп таким образом?

Решение, которое я нашел, заключается в том, чтобы сначала определить положение каждого из тегов таблицы открытия и закрытия, используя finditer и получение промежутков, а затем сжать промежутки с помощью numbCols. Затем я могу использовать этот список, чтобы разрезать и соединить кусочки моей строки вместе. После этого я могу использовать BeautifulSoup для преобразования html в текст.

Я уверен, что смогу сделать все это в BeautifulSoup. Любые предложения или ссылки на существующие примеры будут отличными. Я должен отметить, что мои исходные файлы могут быть большими, и у меня есть тысячи для обработки.

Не было ответа, но я все ближе

1 Ответ

0 голосов
/ 16 мая 2009

Человек, я люблю этот материал Предполагая в простом случае, что я хочу удалить все таблицы, в которых есть строки с длиной столбца больше 3, мой ответ

for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
            rows.append(columns)
        if max(rows)>3:
          table.delete()

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

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