Получение «TypeError: аргумент должен быть целочисленным или байтовоподобным объектом, а не« str »» при поиске строки на веб-странице - PullRequest
0 голосов
/ 09 июля 2019

Я использую Python 3.7 и Django.Я хочу найти строку на странице HTML.Я пробовал это ...

req = urllib2.Request(article.path, headers=settings.HDR)
html = urllib2.urlopen(req, timeout=settings.SOCKET_TIMEOUT_IN_SECONDS).read()
is_present = html.find(token_str) >= 0

, но это приводит к ошибке

TypeError: argument should be integer or bytes-like object, not 'str'

, сообщающей о последней строке, где я делаю "найти".Как правильно искать строку в HTML?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Дейв!

Для извлечения данных из файлов HTML я очень рекомендую библиотеку Beautiful Soup.На данный момент вы можете просто искать этот токен во всех тегах HTML-файла, но в другое время вы можете искать более сложные вещи, такие как поиск фрагмента строки, который находится только внутри определенного тега абзаца.Чтобы установить его с помощью pip:

pip install beautifulsoup4

Для вашего случая, вот протестированный фрагмент, который может решить вашу проблему.Он использует простой шаблон регулярного выражения для искомого токена.Если для этого токена есть соответствие внутри тега HTML, он возвращает True.В противном случае False.

Я надеюсь, что эта функция поможет вам начать работу с Beautifulsoup.Это действительно мощная библиотека.

import re

from bs4 import BeautifulSoup

html_doc = """
<html>
 <head>
  <title>
   Here goes somet title
  </title>
 </head>
 <body>
  <p class="title">
   <b>
    Hello World!
   </b>
  </p>
  <p class="class1">
   Once upon a time..... there was a my_token here....
   <a class="token" href="http://example.com/token" id="link1">
  </p>

  <p class="class2">
   Nope....
  </p>
 </body>
</html>
"""


def search_inside_whole_html_tags_for(html_doc, str_lookup):
    """
    Looks for a str_lookup using a simple regexp pattern. Returns
    True if the str_lookup was found in the whole HTML text. Otherwise,
    returns False.
    """
    html_soup = BeautifulSoup(html_doc, "html.parser")

    # simple regepx pattern: the fixed str lookup
    rslt = html_soup.find_all(text=re.compile(str_lookup))

    return bool(rslt)


print(search_inside_whole_html_tags_for(html_doc, str_lookup="my_tokenx"))
print(search_inside_whole_html_tags_for(html_doc, str_lookup="my_token"))  # this the token

>>> False
>>> True
0 голосов
/ 09 июля 2019

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

Тест:

>>> token_str = 'test'
>>> token_str >= 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>=' not supported between instances of 'str' and 'int'
>>> token_str != None
True

Рекомендуемое решение:

is_present = html.find(int(token_str)) >= 0

или

is_present = html.find(token_str) != None

...