【问题标题】:How can I 'cycle' though similar blocks of HTML using BeautifulSoup?如何使用 BeautifulSoup 通过类似的 HTML 块“循环”?
【发布时间】:2020-05-25 20:16:43
【问题描述】:

我想从"items" 类中的每个"item watching" 中提取信息。我被卡住了,因为当我尝试find 时,它只会找到第一个“项目观看”的 HTML,但我不想使用find_all,因为它会产生一个我无法美化的巨大斑点,它会更难循环浏览信息。

soup = BeautifulSoup(res.text, "html.parser") # SOUP
class_items = soup.find("div", attrs={"data-name":"watching"}).find("div", class_="items") # Narrowed Down

actual_items = class_items.find("div", class_="item watching") # Was thinking [x] so I can cycle?

整个沙浜:

import requests
from bs4 import BeautifulSoup
payload = {"username":"?????", "password":"?????"}
url = "https://9anime.to/user/watchlist"
loginurl = "https://9anime.to/user/ajax/login"
with requests.Session() as s:
    res = s.post(loginurl, data=payload)
    res = s.get(url)
    soup = BeautifulSoup(res.text, "html.parser")
    class_items = soup.find("div", attrs={"data-name":"watching"}).find("div", class_="items")
    actual_items = class_items.find_next("div", class_="item watching")
    print(actual_items.prettify())

网站网址:https://9anime.to/ 登录网址:https://9anime.to/user/ajax/login

每个“项目观看”的预期输出(每个项目的格式相似):

<div class="item watching">
 <a class="thumb" href="/watch/kaguya-sama-love-is-war-season-2.omkj?ep=7">
  <img alt="Kaguya-sama: Love is War Season 2" src="https://static.akacdn.ru/files/images/2019/10/f53e6536aa7b3b95e6fe4c6d7b8e1a9b.jpg"/>
 </a>
 <a class="link" data-jtitle="Kaguya-sama wa Kokurasetai?: Tensai-tachi no Renai Zunousen" data-tip="/ajax/film/tooltip/omkj?v=5dab1c5b" href="/watch/kaguya-sama-love-is-war-season-2.omkj?ep=7">
  Kaguya-sama: Love is War Season 2
 </a>
 <span class="current">
  7
 </span>
 <div class="info">
  <span class="state old tip" data-id="omkj" data-unwatched="Unwatched" data-value="0" data-watched="Watched" title="Click to change">
   Watched
  </span>
  <span class="status">
   7/12
  </span>
  <span class="dropdown userbookmark" data-id="omkj">
   <i class="icon icon-pencil-square" data-toggle="dropdown">
   </i>
   <ul class="dropdown-menu bookmark choices pull-right" data-id="omkj">
    <li data-value="watching">
     <a>
      <i class="fa fa-eye">
      </i>
      Watching
     </a>
    </li>
    <li data-value="watched">
     <a>
      <i class="fa fa-check">
      </i>
      Completed
     </a>
    </li>
    <li data-value="onhold">
     <a>
      <i class="fa fa-hand-grab-o">
      </i>
      On-Hold
     </a>
    </li>
    <li data-value="dropped">
     <a>
      <i class="fa fa-eye-slash">
      </i>
      Drop
     </a>
    </li>
    <li data-value="planned">
     <a>
      <i class="fa fa-bookmark">
      </i>
      Plan to watch
     </a>
    </li>
    <li class="divider" role="separator">
    </li>
    <li data-value="remove">
     <a>
      <i class="fa fa-remove">
      </i>
      Remove entry
     </a>
    </li>
   </ul>
  </span>
 </div>
 <div class="clearfix">
 </div>
</div>

【问题讨论】:

  • 你能分享 URL 和预期的输出吗?
  • 你可能想使用find_next
  • @AndrejKesely 为你更新了我的帖子。
  • @EvanSchwartzentruber 因为我没有登录到那个网站,我只是猜测:actual_items = soup.select('div.item.watching:has(div.info)') 将选择所有 &lt;div&gt;sclass="item watching" 里面有 div class="info"

标签: python html beautifulsoup


【解决方案1】:

一种方法是使用CSS selectorsselect function

actual_items = soup.select('div.content > div.items > div.item.watching')
for item in actual_items:
    print(item.prettify())

【讨论】:

  • 我研究了 CSS 选择器,这看起来很棒,但我想知道是否有任何方法可以使用这种方法将每个 item.watching 存储到一个列表中。
  • 如果我理解正确的话,actual_items 就是它。这是bs4.Element.Tag 对象的列表,每个对象都是item.watching div 之一。
  • 啊,是的,你是对的!这正是我想要的谢谢! actual_items[x].prettify() 访问其他项目d
【解决方案2】:

我不是一个漂亮的汤专家,但我遇到了类似的问题,使用 find_all 然后创建一个较小的变量 did 帮助我将信息可视化。

df=pd.DataFrame()

for i in soup:
    class_items = i.find_all("div", class_="item_watching")
    for x in class_items:
        df = df.append({'Actual Items': x.text.strip()}, ignore_index=True)

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2015-03-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多