我正在尝试通过“ 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
答案 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
谢谢大家:)