【问题标题】:find_all() method from BeautifulSoup returns empty listBeautifulSoup 中的 find_all() 方法返回空列表
【发布时间】:2021-03-16 06:48:25
【问题描述】:

我是编程新手,也是 pyhon 新手。

我的目的是建立一个 ebay 网络爬虫。

我正在尝试使用 bs4 find_all() 方法提取链接列表,但无论我尝试什么,它总是返回一个空列表。

def get_index_data(soup):

    try:
        links = soup.find_all('a', {'class': 's-item__link'})
        print(links)
    except:
        links = []
        print(links)

我也是这样写的。

links = soup.find_all('a', class_= 's-item__link')

它还返回一个空列表。完全不知道怎么回事

编辑:

    import requests
from bs4 import BeautifulSoup


def get_page(url):

    response = requests.get(url)

    if not response.ok:
        print('server responded: ', response.status_code)
    else:
        soup = BeautifulSoup(response.text, 'lxml')
    return soup


def get_index_data(soup):
    links = soup.find_all('a')

    print(links)


def main():

    url = 'https://www.ebay.de/sch/i.html?_nkw=armbanduhr&_pgn=1 '
    get_index_data(get_page(url))


if __name__ == '__main__':
    main()

编辑2

仅使用 .find_all('a') 运行代码后出错


Traceback (most recent call last):
  File "C:\Users\Aleksandar\Desktop\My ebay scraper\test", line 29, in <module>
    main()
  File "C:\Users\Aleksandar\Desktop\My ebay scraper\test", line 25, in main
    get_index_data(get_page(url))
  File "C:\Users\Aleksandar\Desktop\My ebay scraper\test", line 19, in get_index_data
    print(links)
  File "C:\Users\Aleksandar\AppData\Local\Programs\Python\Python38\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2705' in position 28776: character maps to <undefined>

【问题讨论】:

  • 您能分享您要废弃的页面,以便我们复制问题吗?
  • 也许您尝试抓取的页面使用了动态 Javascript,在这种情况下您无法使用 BeautifulSoup 抓取它。但是,如果是这种情况,您可以使用 Selenium。
  • 显而易见的答案是该页面上没有任何&lt;a class="s-item__link"&gt; 元素。你能告诉我们soup吗?
  • 我不知道到底是什么问题,但它可能出在你意想不到的地方。如果你扩大搜索范围,只找到带有 soup.find_all('a') 的“a”元素会发生什么你能遍历它们并找到你正在寻找的类吗?
  • 好的,谢谢大家

标签: python python-3.x web-scraping beautifulsoup


【解决方案1】:

您的代码未向我们显示您尝试解析的网址。

请...尝试理解解析一个简单页面的概念...

Ebay 使用 JavaScript,抓取有点困难...

我会写一个简单的...

希望能帮助你理解一些概念...

from bs4 import BeautifulSoup
import requests

page = "https://en.wikipedia.org/wiki/Main_Page"

page_text = requests.get(page).text

soup = BeautifulSoup(page_text, 'lxml')

# print(soup)
links = []
links = soup.find_all("a")

for link in links:
    print(link)

【讨论】:

  • 谢谢!但是 URL 在代码的底部。它保存为变量 url。这里是页面ebay.de/sch/…
  • @radna_skela 我的错!我没有看到整个代码!你为你的问题做了一个很好的帖子!我的错!
  • 不,谢谢,真的。你的例子工作得很好。但是我使用的代码不知何故,很奇怪
  • 问题是你试图解析的页面是用 JavaScript 渲染的。而这个 JavaScript 在浏览器上运行。我在尝试解析 youtube 频道时遇到了同样的问题。试试这个帖子:stackoverflow.com/questions/61991229/…
  • 是的,我认为您是对的,因为您的示例有效。你对从 JS 网站抓取有什么建议吗?谢谢!
【解决方案2】:

BeautifulSoup 针对不同情况有几种不同类型的解析器。过去我一直坚持使用“html.parser”而不是“lxml”。有时在“html.parser”将返回结果的情况下,使用“lxml”实际上会返回 None。

这可能就是您收到错误消息和空结果的原因,我会尝试这样做。当我写出与您类似的东西时,它起作用了。由于 a 标签被大量使用,你可能会得到一大块东西来解析,但如果你从 lxml 更改为 html.parser 它应该可以工作!

网络抓取可能很难掌握,但一旦你做到了,它就会变得非常有趣。在 Youtube 上有很多很棒的视频谈论 beautifulsoup。

【讨论】:

  • 我尝试了 html.parser,但不幸的是它仍然无法正常工作,我相信这是因为 ebay 中的 Javascript...但是网络抓取很棒,我也可以说这些 youtube 视频是太棒了=D
猜你喜欢
  • 2019-12-12
  • 2019-03-25
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多