Web scraping 如何使用bs4从网站中刮取相同级别的元素

Web scraping 如何使用bs4从网站中刮取相同级别的元素,web-scraping,beautifulsoup,Web Scraping,Beautifulsoup,我正试图从以下网站上搜集这些书籍和作者的列表: 我首先使用以下方法创建一个汤对象: 汤=美汤(r.content,features='lxml') 然后我检查chrome上的特定元素,并通过以下方式过滤页面的特定部分: listicle=soup.find('div',class='content''article-body from content-api js-article') 现在,对于令人困惑的部分: 该列表的索引、书名和作者姓名都位于同一级别(h2)。我可以通过查找('h2')获得

我正试图从以下网站上搜集这些书籍和作者的列表:

我首先使用以下方法创建一个汤对象: 汤=美汤(r.content,features='lxml')

然后我检查chrome上的特定元素,并通过以下方式过滤页面的特定部分:

listicle=soup.find('div',class='content''article-body from content-api js-article')

现在,对于令人困惑的部分:

  • 该列表的索引、书名和作者姓名都位于同一级别(h2)。我可以通过查找('h2')获得“索引”,然后尝试使用下一个兄弟来访问其余部分。有更好的办法吗
  • 即使我找到了上面的第1条,我也需要编写一个“for循环”来访问列表中的其余条目?我似乎不知道怎么做,因为我创建的'listicle'变量只包含一个列表,它不一定通过每个条目(第1册、第2册等)列出,而是通过列表中的每个元素(第1册索引、第1册作者等)列出

  • 我对网页抓取是完全陌生的。如果这是一个非常愚蠢的问题,我深表歉意。

    一个解决方案是使用selectall
    zip()函数。例如:

    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://www.theguardian.com/books/2019/sep/21/best-books-of-the-21st-century'
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')
    
    h2s = soup.select('.content__article-body h2')[::-1]   # we want go in ascending fashion
    for author, title, i in zip(h2s[::3], h2s[1::3], h2s[2::3]):
        print('{:<5} {:<60} {}'.format(i.text, title.text, author.text))
    

    一种解决方案是使用selectall
    并使用
    zip()
    函数。例如:

    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://www.theguardian.com/books/2019/sep/21/best-books-of-the-21st-century'
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')
    
    h2s = soup.select('.content__article-body h2')[::-1]   # we want go in ascending fashion
    for author, title, i in zip(h2s[::3], h2s[1::3], h2s[2::3]):
        print('{:<5} {:<60} {}'.format(i.text, title.text, author.text))
    

    非常感谢你。这很有帮助,非常感谢。这有帮助。