Как исправить ошибку выбора bs4: «Ошибка типа: __init __ () ключевые слова должны быть строками» - PullRequest
0 голосов
/ 06 января 2019

Я пишу скрипт, который использует почтовый запрос и получает взамен XML. Мне нужно проанализировать этот XML, чтобы узнать, был ли принят почтовый запрос или нет. Я использую bs4 для его анализа, и он работал нормально примерно неделю назад, когда я начал получать сообщение об ошибке, которого раньше не было:

TypeError: __init__() keywords must be strings

Я использую функцию выбора bs4 в других частях того же файла без этой ошибки, и я не могу найти что-либо об этом в Интернете. Сначала я думал, что это проблема с версией, но я попробовал оба python3.7 и 3.6 и получил ту же ошибку.

Это код, использованный для выдачи ошибки:

res = requests.post(url, data = body, headers = headers)
logging.debug('Res HTTP status is {}'.format(res.status_code))

try:
    res.raise_for_status()
    resSoup = BeautifulSoup(res.text, 'xml')
    # get the resultcode from the resultcode tag
    resCode = resSoup.select_one('ResultCode').text

Полная ошибка:

Traceback (most recent call last):
  File "EbarInt.py", line 292, in <module>
    resCode = resSoup.select_one('ResultCode').text
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\bs4\element.py", line 1345, in select_one
    value = self.select(selector, namespaces, 1, **kwargs)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\bs4\element.py", line 1377, in select
    return soupsieve.select(selector, self, namespaces, limit, **kwargs)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\soupsieve\__init__.py", line 108, in select
    return compile(select, namespaces, flags).select(tag, limit)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\soupsieve\__init__.py", line 50, in compile
    namespaces = ct.Namespaces(**(namespaces))
TypeError: __init__() keywords must be strings

Когда я проверяю тип res.text, я получаю класс 'str', как и ожидалось.

Когда я регистрируюсь res.text Я получаю:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><soap:Header><wsa:Action>Trackem.Web.Services/CreateOrUpdateTaskResponse</wsa:Action><wsa:MessageID>urn:uuid:3ecae312-d416-40a5-a6a3-9607ebf28d7a</wsa:MessageID><wsa:RelatesTo>urn:uuid:6ab7e354-6499-4e37-9d6e-61219bac11f6</wsa:RelatesTo><wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To><wsse:Security><wsu:Timestamp wsu:Id="Timestamp-6b84a16f-327b-42db-987f-7f1ea52ef802"><wsu:Created>2019-01-06T10:33:08Z</wsu:Created><wsu:Expires>2019-01-06T10:38:08Z</wsu:Expires></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><CreateOrUpdateTaskResponse xmlns="Trackem.Web.Services"><CreateOrUpdateTaskResult><ResultCode>OK</ResultCode><ResultCodeAsInt>0</ResultCodeAsInt><TaskNumber>18000146</TaskNumber></CreateOrUpdateTaskResult></CreateOrUpdateTaskResponse></soap:Body></soap:Envelope>

1 Ответ

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

Обновление: BeautifulSoup 4.7.1 был выпущен, исправляя проблему пространства имен по умолчанию. См. заметки о выпуске . Возможно, вы захотите обновить только для исправления производительности.

Оригинальный ответ:


Вы, должно быть, обновились до BeautifulSoup 4.7, который заменил простой и ограниченный внутренний синтаксический анализатор CSS на проект soupsieve , который является гораздо более полной реализацией CSS.

Это тот проект, у которого есть проблема с пространством имен по умолчанию, прикрепленным к одному из элементов в вашем ответе:

<CreateOrUpdateTaskResponse xmlns="Trackem.Web.Services">

Синтаксический анализатор XML, используемый для построения дерева объектов BeautifulSoup, правильно передает это как отображение None -> 'Trackem.Web.Services' в словаре пространства имен, но код soupsieve требует, чтобы все пространства имен имели префиксное имя (xmlns:prefix ) с пространством имен по умолчанию, помеченным пустой строкой, а не None, что приводит к этой ошибке. Я сообщил об этом как выпуск # 68 проекту soupsieve .

Вам вообще не нужно использовать select_one здесь, вы не используете никакой синтаксис CSS, кроме имени элемента. Используйте soup.find() вместо:

resCode = resSoup.find('ResultCode').text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...