繁体   English   中英

网页抓取与beautifulsoup出现错误

[英]web scraping with beautifulsoup getting error

我对Python很陌生,主要需要它来从网站获取信息。

def spider(max_pages):
    page = 1
    while page <= max_pages:
        url = 'https://www.example.com'
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text, "html.parser")
        for link in soup.findAll('a', {'class': 'c5'}):
            href = link.get('href')
            time.sleep(0.3)
            # print(href)
            single_item(href)
        page += 1
def single_item(item_url):
    s_code = requests.get(item_url)
    p_text = s_code.text
    soup = BeautifulSoup(p_text, "html.parser")
    upc = ('div', {'class': 'product-upc'})
    for upc in soup.findAll('span', {'class': 'upcNum'}):
        print(upc.string)
    sku = ('span', {'data-selenium': 'bhSku'})
    for sku in soup.findAll('span', {'class': 'fs16 c28'}):
        print(sku.text)
    price = ('span', {'class': 'price'})
    for price in soup.findAll('meta', {'itemprop': 'price'}):
        print(price)

    outFile = open(r'C:\Users\abc.txt', 'a')
    outFile.write(str(upc))
    outFile.write("\n")
    outFile.write(str(sku))
    outFile.write("\n")
    outFile.write(str(price))
    outFile.write('\n')
    outFile.close()

spider(1)

我想要得到的是“ UPC:813066012487,价格:26.45和SKU:KBPTMCC2”,没有任何跨度,元数据或内容属性。我在下面附加了我的输出这是我的输出: 屏幕截图

我在哪里做错了? 希望有人能弄清楚! 谢谢!!

您想要的数据位于div属性data-itemdata中 ,您可以调用json.loads ,它将给您一个字典,您可以访问该字典以获取所需的内容:

from bs4 import BeautifulSoup
import requests
import json

soup = BeautifulSoup(requests.get("https://www.bhphotovideo.com/c/buy/accessories/ipp/100/mnp/25/Ns/p_PRICE_2%7c0/ci/20861/pn/1/N/4005352853+35").content, "html.parser")


for d in soup.select("div[data-selenium=itemDetail]"):
    data = json.loads(d["data-itemdata"])
    print(data)

每个数据字典将如下所示:

{u'catagoryId': u'20861',
 u'inCart': False,
 u'inWish': False,
 u'is': u'REG',
 u'itemCode': u'KBPTMCC2',
 u'li': [],
 u'price': u'26.45',
 u'searchTerm': u'',
 u'sku': u'890522'}

因此,只需按键即可访问,即price = data["price"]

要获取UPC,我们只需要访问商品页面,我们可以从h3中获取带有data-selenium属性的网址:

for d in soup.select("div[data-selenium=itemDetail]"):
    url = d.select_one("h3[data-selenium] a")["href"]
    upc = BeautifulSoup(requests.get(url).content, "html.parser").select_one("span.upcNum").text.strip()
    data = json.loads(d["data-itemdata"])

并非所有页面都具有UPC值,因此,如果您只想让带有UPC的产品首先检查选择项是否找到任何内容,则必须决定要做什么:

for d in soup.select("div[data-selenium=itemDetail]"):
    url = d.select_one("h3[data-selenium] a")["href"]

    upc = BeautifulSoup(requests.get(url).content, "html.parser").select_one("span.upcNum")
    if upc:
        data = json.loads(d["data-itemdata"])
        text = (upc.text.strip()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM