BeautifulSoup - TypeError: элемент последовательности 0: ожидаемый экземпляр str - PullRequest
0 голосов
/ 02 января 2019

Я создал веб-сканер, используя python, и все работает нормально, пока не дойдет до этого раздела кода:

    # Use BeautifulSoup modules to format web page as text that can
    # be parsed and indexed
    #
    soup = bs4.BeautifulSoup(response, "html.parser")
    tok = "".join(soup.findAll("p", text=re.compile(".")))
    # pass the text extracted from the web page to the parsetoken routine for indexing
    parsetoken(db, tok)
    documents += 1

Я получаю ошибку TypeError: sequence item 0: expected str instance, тег находится вокруг строки токена в коде.
Я думаю, что мой синтаксис мог быть проблемой, но я не уверен. Как я могу это исправить?

1 Ответ

0 голосов
/ 02 января 2019

Здесь есть несколько проблем:

  • Во-первых, я не уверен, откуда вы получаете response, но это должна быть строка из реального HTML.Удостоверьтесь, что вы не просто захватываете код ответа от очистки сайта, который сообщает вам, был ли он успешным.
  • Что еще более важно, хотя, когда вы делаете "findAll", обратите внимание, что это возвращает список объектов BeautifulSoup, не список строк.Таким образом, команда "join" не знает, что с ними делать.Он смотрит на первый объект в списке, видит, что это не строка, и поэтому он выдает ошибку с жалобой, что он «expected str instance».Хорошей новостью является то, что вы можете использовать .text для извлечения фактического текста из заданного элемента <p>.
  • Хотя даже если вы используете .text для извлечения фактического текста из каждого <p> объекта,ваш join() может все еще потерпеть неудачу, если ваш список представляет собой сочетание форматов unicode и str.Поэтому, возможно, вам придется выполнить некоторые приемы кодирования, чтобы получить все одинакового типа, прежде чем присоединиться.

Вот пример, который я сделал, используя эту самую страницу:

>>> import bs4, re
>>> import urllib2
>>> url = "https://stackoverflow.com/questions/3925614/how-do-you-read-a-file-into-a-list-in-python"
>>> html = urllib2.urlopen(url).read()
>>> soup = bs4.BeautifulSoup(html, "html.parser")
>>> L = soup.findAll("p", text=re.compile("."))
>>> M = [t.text.encode('utf-8') for t in L]
>>> print(" ".join(M))

Это печатаетобъединенный текст всего найденного в теге "P".

EDIT : этот пример был на Python 2.7.x.Для версии 3.x удалите «.encode ('utf-8')».

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