python html 텍스트 추출 방법
Selectolax로 Beautiful Soup을 교체하면 거의 5-30배의 가속을 무료로 받을 수 있습니다!
이것은 간단한 기준 테스트입니다. commoncrawl (NLP 문제를 처리할 때, 때때로 대량의 텍스트 집합을 얻어야 합니다. 인터넷은 텍스트의 가장 큰 원천이지만, 불행하게도 임의의 HTML 페이지에서 텍스트를 추출하는 것은 어렵고 고통스러운 작업입니다.
여러 웹 페이지에서 전체 텍스트를 추출하고 모든 HTML 태그를 분리해야 한다고 가정하십시오.일반적으로 기본 솔루션은 BeautifulSoup 패키지의 get_text 방법, 이 방법은 내부적으로 lxml을 사용합니다.이것은 충분한 테스트를 거친 해결 방안이지만 수천 수만 개의 HTML 문서를 처리할 때 매우 느릴 수 있다.
Selectolax로 Beautiful Soup을 교체하면 거의 5-30배의 가속을 무료로 받을 수 있습니다!이것은 간단한 기준 테스트로commoncrawl를 분석할 수 있다 (https://commoncrawl.org/)의 10000개 HTML 페이지:
# coding: utf-8
from time import time
import warc
from bs4 import BeautifulSoup
from selectolax.parser import HTMLParser
def get_text_bs(html):
tree = BeautifulSoup(html, 'lxml')
body = tree.body
if body is None:
return None
for tag in body.select('script'):
tag.decompose()
for tag in body.select('style'):
tag.decompose()
text = body.get_text(separator='
')
return text
def get_text_selectolax(html):
tree = HTMLParser(html)
if tree.body is None:
return None
for tag in tree.css('script'):
tag.decompose()
for tag in tree.css('style'):
tag.decompose()
text = tree.body.text(separator='
')
return text
def read_doc(record, parser=get_text_selectolax):
url = record.url
text = None
if url:
payload = record.payload.read()
header, html = payload.split(b'\r
\r
', maxsplit=1)
html = html.strip()
if len(html) > 0:
text = parser(html)
return url, text
def process_warc(file_name, parser, limit=10000):
warc_file = warc.open(file_name, 'rb')
t0 = time()
n_documents = 0
for i, record in enumerate(warc_file):
url, doc = read_doc(record, parser)
if not doc or not url:
continue
n_documents += 1
if i > limit:
break
warc_file.close()
print('Parser: %s' % parser.__name__)
print('Parsing took %s seconds and produced %s documents
' % (time() - t0, n_documents))
>>> ! wget https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2018-05/segments/1516084886237.6/warc/CC-MAIN-20180116070444-20180116090444-00000.warc.gz
>>> file_name = "CC-MAIN-20180116070444-20180116090444-00000.warc.gz"
>>> process_warc(file_name, get_text_selectolax, 10000)
Parser: get_text_selectolax
Parsing took 16.170367002487183 seconds and produced 3317 documents
>>> process_warc(file_name, get_text_bs, 10000)
Parser: get_text_bs
Parsing took 432.6902508735657 seconds and produced 3283 documents
분명히 이것은 어떤 사물에 대해 기준 테스트를 하는 가장 좋은 방법은 아니지만, 이것은 selectolax가 때때로 lxml보다 30배 빠르다는 생각을 제공한다.selectolax는 HTML을 일반 텍스트로 분리하는 데 가장 적합합니다.만약 내가 10000여 개의 HTML 세션을 가지고 있다면, 그것들을 순수한 텍스트 인덱스로 Elasticsearch에 넣어야 한다.(Elasticsearch에는 html_strip 텍스트 필터가 있지만 이 상하문에서 사용할 필터가 아닙니다.이러한 규모로 HTML을 순수한 텍스트로 박리하는 것은 사실상 매우 효과가 없다는 사실이 증명된다.그렇다면 가장 효과적인 방법은 무엇입니까?
from pyquery import PyQuery as pq
text = pq(html).text()
from selectolax.parser import HTMLParser
text = HTMLParser(html).text()
import re
regex = re.compile(r'<.*?>')
text = clean_regex.sub('', html)
결과
나는 시간을 계산하기 위해 스크립트를 작성했다. 이 스크립트는 HTML 세션을 포함하는 10000개의 파일을 두루 훑어보았다.주의!이 부분들은 완전한 문서(와 등이 있음)가 아니라 HTML의 일부분일 뿐이다.평균 크기는 10314바이트(중위 5138바이트)입니다.결과는 다음과 같습니다.
pyquery
SUM: 18.61 seconds
MEAN: 1.8633 ms
MEDIAN: 1.0554 ms
selectolax
SUM: 3.08 seconds
MEAN: 0.3149 ms
MEDIAN: 0.1621 ms
regex
SUM: 1.64 seconds
MEAN: 0.1613 ms
MEDIAN: 0.0881 ms
나는 이미 여러 차례 운행을 했는데, 결과는 매우 안정적이다.포인트는 selectolax가 PyQuery보다 7배 빠르다는 것이다.정규 표현식이 좋습니까?진짜예요?
가장 기본적인 HTML Blob은 잘 작동할 수 있습니다.실제로 HTML이
Foo&amp인 경우Bar
, 나는 순수한 텍스트 변환이 Foo&Bar가 아니라 Foo&amp가 되기를 바란다.bar.더 중요한 것은 PyQuery와selectolax는 매우 특정하지만 나의 용례에 매우 중요한 내용을 지원한다는 것이다.계속하기 전에 일부 탭 (및 내용) 을 삭제해야 합니다.예:
<h4 class="warning">This should get stripped.</h4>
<p>Please keep.</p>
<div style="display: none">This should also get stripped.</div>
정규 표현식은 영원히 이 점을 할 수 없다.2.0 버전
따라서 나의 요구는 변화할 수 있지만, 기본적으로 나는 일부 라벨을 삭제하고 싶다.예를 들어
,
과
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.