与模块“ re”匹配的模式发生TypeError

时间:2018-07-02 12:28:12

标签: python regex beautifulsoup python-3.6

我正在尝试通过“ bs4” BeautifulSoup库解析HTML来从程序中提取商品价格

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 :(得分:0)

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()

这绝对不是漂亮或非常pythonic,但是它将完成工作。 请注意,我将呼叫放到了re.compile,因为无论如何当您呼叫re.findall时,该呼叫都会在后台运行。

答案 1 :(得分:0)

这是最终的样子:)

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

谢谢大家:)