Извлечение сущностей из простора - PullRequest
0 голосов
/ 14 января 2020

У меня есть python файл для создания веб-страниц: scrapper.py::

from bs4 import BeautifulSoup
import requests
source = requests.get('https://en.wikipedia.org/wiki/Willis').text
soup = BeautifulSoup(source,'lxml')

def my_function():

    heading = soup.find('h1',{'id':'firstHeading'}).text
    print(heading)
    print()
for item in soup.select("#mw-content-text"):
        required_data = [p_item.text for p_item in item.select("p")][1:3]
        print('\n'.join(required_data).encode('utf-8'))

    Willis= soup.find("caption",{"class":"fn org"}).text
    print(Willis)
    print()

Я хочу использовать spacy для извлечения сущностей из scrapper.py :: pyspacy.py

import spacy
import scrapper

entity_list = []

nlp = spacy.load("en_core_web_sm")


doc = nlp(scrapper.my_function())

for entity in doc.ents:
    entity_list.append((entity.text, entity.label_))
print(entity_list)

Это просто дает мне вывод :: in терминал для списанных данных вместе с ошибкой ::

** 
Traceback (most recent call last):
  File "hakuna_spacy.py", line 12, in <module>
    doc = nlp(printwo.pubb())
  File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\spacy\language.py", 
line 423, in __call__
    if len(text) > self.max_length:

TypeError: object of type 'NoneType' has no len()

 **

Что я делаю не так? Может кто-нибудь объяснить мне, пожалуйста?

1 Ответ

1 голос
/ 14 января 2020

В исходном фрагменте кода у вас была проблема, что pubb печатает текст в stdout, но не возвращает значение. Вместо этого вы должны попробовать:

def pubb():
    return 'hello, world'

[Редактировать]:

В отредактированной версии я вижу некоторые другие проблемы.

Выборка работает, поэтому:

>>> source = requests.get('https://en.wikipedia.org/wiki/Willis').text
>>> len(source)
36836

bs4 также правильно находит заголовок:

>>> soup = BeautifulSoup(source,'lxml')
>>> soup.find('h1',{'id':'firstHeading'}).text
'Willis'

bs4 также находит элемент в разделе содержимого (только 1):

>>> len(soup.select("#mw-content-text"))
1

Проблема то, что он не находит никакого контента как такового:

>>> soup.select("#mw-content-text")[0].select("p")[1:3]
[]

И он не находит заголовок:

>>> soup.find("caption",{"class":"fn org"})                                                                                                                                                                   
>>>

У вас также есть ранее существовавшая проблема, которую вы не возвращают никакого текста из my_function, поэтому оболочка, которая передает возвращаемое значение этой функции в вызов spacy, передается None, что дает вам исключение. Что вы хотите my_function вернуть?

...