문서 분석을 기반으로 문서를 텍스트로 변환하기 전에 BeautifulSoup에서 문서를 분할할 수 있나요?

StackOverflow https://stackoverflow.com/questions/866772

  •  22-08-2019
  •  | 
  •  

문제

텍스트로 변환하고 싶은 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에 대해 작업을 수행하고 목록에 있는 각 항목의 len과 목록에 있는 각 항목의 값을 사용하여 테이블의 특성을 분석하고 유지하거나 폐기할 항목을 식별할 수 있습니다.

텍스트를 가져오기 위해 BeautifulSoup에서 이 정보를 사용하는 우아한 방법이 보이지 않습니다.내가 얻으려는 것은 numbCols를 분석하고 특정 문서의 10개 테이블 중 테이블 2, 4, 6 및 9를 제외하기로 결정했다고 가정하는 것입니다.따라서 html 문서의 일부에는 해당 테이블을 제외한 모든 것이 포함됩니다.어떻게 수프를 그런 식으로 나눌 수 있나요?

내가 생각해낸 해결책은 먼저 finditer를 사용하여 각 테이블 열기 및 닫기 태그의 위치를 ​​식별하고 범위를 가져온 다음 numbCols를 사용하여 범위를 압축하는 것입니다.그런 다음 이 목록을 사용하여 문자열 조각을 잘라내고 결합할 수 있습니다.이 작업이 완료되면 BeautifulSoup을 사용하여 HTML을 텍스트로 변환할 수 있습니다.

나는 BeautifulSoup에서 이 모든 것을 할 수 있어야 한다고 확신합니다.기존 예제에 대한 제안이나 링크가 있으면 좋습니다.내 소스 파일이 커질 수 있고 처리해야 할 파일이 수천 개나 된다는 점을 언급하고 싶습니다.

답은 없었지만 점점 가까워지고 있어

도움이 되었습니까?

해결책

남자 나는이 물건을 좋아하는 순진한 케이스에서 열 길이가 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()

해당 루프의 어느 수준에서나 원하는 처리를 수행할 수 있으며, 테스트를 식별하고 테스트할 올바른 인스턴스를 가져오기만 하면 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top