Предварительной обработки HTML-ввода и произвести подсчет слов


Ниже вы видите продукт Мой первый ребенок-шаги в программировании. Целью сценария является двоякой: 1. Взять ввод HTML-страницы, обработать его и вернуть соответствующую информацию, такую как идентификатор документа, текст, и заголовок. 2. Произвести подсчет слов во всех статьях.

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

import re
import pandas as pd
from urllib.request import urlopen as uReq
from sklearn.feature_extraction.text import CountVectorizer

TAG_RE = re.compile(r'<[^>]+>')
def RemoveTags(text):
     """Remove all html tags"""
     return TAG_RE.sub('', text)

ESCAPES_RE = re.compile(r'\\.')
def RemoveEscapes(text):
    """Remove extra escape characters from encoding"""
    return ESCAPES_RE.sub('', text)

def ReadFromLink(link):
    """Read html from link and return raw html"""
    with uReq(link) as response:
        html = response.read()#
        html = str(html).lower()
        return html.lower()

def ArticleRaw(html):
    """Find articles in html"""
    article = re.findall(r'<doc>.*?</doc>', html)
    return article

def GetDocID(html):
    """Find document ids in html"""
    docid = re.findall(r'<docid>(.*?)</docid>', html)
    docid = [docid.strip() for docid in docid]
    docid = [int(docid) for docid in docid] 
    return docid

def GetHeadline(html):
    """Find headlines in html"""
    headline = re.findall(r'<headline>(.*?)</headline>', html)
    headline = [RemoveTags(headline) for headline in headline]
    headline = [RemoveEscapes(headline) for headline in headline]
    return headline 

def GetMainText(html):
    """Find maintext in html"""
    maintext = re.findall(r'<text>(.*?)</text>', html)
    maintext = [RemoveTags(maintext) for maintext in maintext]
    maintext = [RemoveEscapes(maintext) for maintext in maintext]
    maintext = [' '.join(maintext.split()) for maintext in maintext]
    return maintext

link = link
html = ReadFromLink(link)

ArticlesDict = {
        "docid": GetDocID(html), 
        "raw_article": ArticleRaw(html), 
        "headline": GetHeadline(html), 
        "maintext": GetMainText(html)
}

def CountFeatures(text):
    documents = ArticlesDict['maintext']
    # Stem first?
    vector = CountVectorizer()
    x = vector.fit_transform(documents)
    df_features = pd.DataFrame(x.toarray(), columns = vector.get_feature_names())
    return df_features

df_features = CountFeatures(df_articles['maintext'])


Комментарии
1 ответ

Если я могу предложить, используя такой инструмент, как красивый суп может значительно помочь вам обойти элементов HTML в простой способ

http://www.pythonforbeginners.com/python-on-the-web/web-scraping-with-beautifulsoup/

Вот вам очень краткий пример о том, как она работает

from bs4 import BeautifulSoup
import requests

r = requests.get("http://any_url_you_want.com")

data = r.text

soup = BeautifulSoup(data)

for text in soup.find_all('text'):
# Here you do whatever you want with text

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

Проверьте также в этой статье, достаточно хорошо объясняет, что вы можете делать с ним и доступно для начинающих

https://www.digitalocean.com/community/tutorials/how-to-scrape-web-pages-with-beautiful-soup-and-python-3

5
ответ дан 3 марта 2018 в 12:03 Источник Поделиться