【问题标题】:Can't print only text using Beautiful soup不能使用美丽的汤只打印文本
【发布时间】:2020-04-18 22:34:48
【问题描述】:

我正在努力在 python3 上创建我的第一个项目。当我使用以下代码时:

def scrape_offers():
    r = requests.get("https://www.olx.bg/elektronika/kompyutrni-aksesoari-chasti/aksesoari-chasti/q-1070/?search%5Border%5D=filter_float_price%3Aasc", cookies=all_cookies)
    soup = BeautifulSoup(r.text,"html.parser")
    offers = soup.find_all("div",{'class':'offer-wrapper'})

    for offer in offers:
        offer_name = offer.findChildren("a", {'class':'marginright5 link linkWithHash detailsLink'})
        print(offer_name.text.strip())

我收到以下错误:

Traceback (most recent call last):
  File "scrape_products.py", line 45, in <module>
    scrape_offers()
  File "scrape_products.py", line 40, in scrape_offers
    print(offer_name.text.strip())
  File "/usr/local/lib/python3.7/site-packages/bs4/element.py", line 2128, in __getattr__
    "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
AttributeError: ResultSet object has no attribute 'text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

我在 StackOverFlow 上读过很多类似的案例,但我还是忍不住。如果有人有任何想法,请帮助:)

P.S.:如果我在没有 .text 的情况下运行代码,它会显示整个 &lt;a class=...&gt; ... &lt;/a&gt;

【问题讨论】:

    标签: python html python-3.x text beautifulsoup


    【解决方案1】:

    findchildren 返回一个列表。有时你会得到一个空列表,有时你会得到一个包含一个元素的列表。

    你应该添加一个if语句来检查返回列表的长度是否大于1,然后打印文本。

    import requests
    from bs4 import BeautifulSoup
    def scrape_offers():
        r = requests.get("https://www.olx.bg/elektronika/kompyutrni-aksesoari-chasti/aksesoari-chasti/q-1070/?search%5Border%5D=filter_float_price%3Aasc")
        soup = BeautifulSoup(r.text,"html.parser")
        offers = soup.find_all("div",{'class':'offer-wrapper'})
    
        for offer in offers:
            offer_name = offer.findChildren("a", {'class':'marginright5 link linkWithHash detailsLink'})
            if (len(offer_name) >= 1):
                print(offer_name[0].text.strip())
    
    scrape_offers()
    

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2014-05-28
      相关资源
      最近更新 更多