Ошибка типа при сопоставлении шаблона с модулем «re» - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь извлечь цену товара из моей программы, анализируя HTML с помощью библиотеки bs4 BeautifulSoup

import requests
import re
from bs4 import BeautifulSoup
request = requests.get("https://www.aliexpress.com/item/Original-Nokia-Lumia-1020-Nokia-Phone-41MP-Camera-Dual-Core-1-5GHz-32GB-ROM-2-GB/32415650302.html?spm=2114.search0104.3.1.67455f99ocHZOB&ws_ab_test=searchweb0_0,searchweb201602_3_10152_10065_10151_10344_10068_10342_10343_10059_10340_10341_10696_100031_10084_10083_10103_524_10618_10624_10307_10623_10622_10621_10620,searchweb201603_43,ppcSwitch_5&algo_expid=a182685b-0e22-4a88-a7be-6a51dfbeac21-3&algo_pvid=a182685b-0e22-4a88-a7be-6a51dfbeac21&priceBeautifyAB=0")
content = request.content
soup = BeautifulSoup(content,"html.parser")
element = soup.find("span",{"itemprop":"price", "id":"j-sku-price","class":"p-price"},text= not None)
pattern_1 = re.compile("/d+./d+").findall(element).text.strip()
print(pattern_1)
print(element)

и вот что я получаю в качестве вывода:

Traceback (most recent call last):
  File "/root/Desktop/Visual_Studio_Files/Python_sample.py", line 9, in <module>
    pattern_1 = (re.compile("/d+./d+").findall(str_ele)).text.strip()
TypeError: expected string or bytes-like object

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

вот как это наконец выглядит:)

import requests
import re
from bs4 import BeautifulSoup
request = requests.get("https://www.aliexpress.com/item/Original-Nokia-Lumia-1020-Nokia-Phone-41MP-Camera-Dual-Core-1-5GHz-32GB-ROM-2-GB/32415650302.html?spm=2114.search0104.3.1.67455f99ocHZOB&ws_ab_test=searchweb0_0,searchweb201602_3_10152_10065_10151_10344_10068_10342_10343_10059_10340_10341_10696_100031_10084_10083_10103_524_10618_10624_10307_10623_10622_10621_10620,searchweb201603_43,ppcSwitch_5&algo_expid=a182685b-0e22-4a88-a7be-6a51dfbeac21-3&algo_pvid=a182685b-0e22-4a88-a7be-6a51dfbeac21&priceBeautifyAB=0")
content = request.content
soup = BeautifulSoup(content,"html.parser")
element = soup.find("span",{"itemprop":"price", "id":"j-sku-price","class":"p-price"}).text.strip()
# pattern_1 = re.compile("/d+./d+").findall(element)
# print (pattern_1)
print (element)

и это вывод:)

146.00

спасибо всем :) 1007 *

0 голосов
/ 02 июля 2018

re.findall волнуется, потому что ваша переменная element имеет тип bs4.element.Tag.

Вы можете узнать это, добавив print(type(element)) в свой скрипт. Основываясь на некоторых быстрых поисках, я думаю, что вы можете извлечь нужную строку из тега, используя атрибут contents (который является списком) и взяв первого члена этого списка (индекс 0).

Более того, re.findall также возвращает список, поэтому вместо .text вам нужно использовать [0] для доступа к первому члену. Таким образом, у вас снова будет строка, поддерживающая метод .strip()!

И последнее, но не менее важное: похоже, вы неправильно набрали косую черту и намеревались использовать \ вместо /.

Вот рабочая версия вашего кода:

pattern_1 = re.findall("\d+.\d+", element.contents[0])[0].strip()

Это определенно не красиво и не очень питонично, но оно выполнит свою работу. Обратите внимание, что я отбросил вызов на re.compile, потому что он запускается в фоновом режиме, когда вы звоните re.findall в любом случае.

...