bs4在对象内部抓取选择

bs4 scraping selection inside object

这是我第一次尝试使用 beautifulsoup 从网上抓取一些字幕。这离我的 objective 还很远,但暂时,我只想实现这个目标(我正在慢慢学习 :D)

我只对这个“tr”对象中的一种语言感兴趣。

下面的代码获取所有字幕对象,因为我不知道如何在“tr”对象中过滤我的选择:

import urllib.request as urlRequest
from bs4 import BeautifulSoup

urlpage = 'https://www.tusubtitulo.com/season/4674/1'
# pretend to be a chrome 47 browser on a windows 10 machine
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"
req = urlRequest.Request(urlpage, headers=headers)
# open the url
url = urlRequest.urlopen(req)
# get the source code
source_code = url.read()

# parse the html using beautiful soup and store in variable 'soup'
soup = BeautifulSoup(source_code, 'html.parser')

results = []
for lang in soup.findAll("td", class_="language"):
    if "Español (España)" in str(lang):
        for element in soup.findAll("a", class_="bt_descarga"):
            results.append(element)
results

如果您只想要西班牙语字幕(因为没有 href,这是未来的事情),您可以获取所有 descarga 元素并获取第一个,然后每第三个开始。

您最终应该有 10 个标题。

方法如下:

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0",
}
page = requests.get("https://www.tusubtitulo.com/season/4674/1", headers=headers).text
spanish_only = [
    a["title"] for a in BeautifulSoup(page, "lxml").select(".bt_descarga")[1::3]
]
print("\n".join(spanish_only))

输出:

Invasion (2021) 1x01 - Last Day
Invasion (2021) 1x02 - Crash
Invasion (2021) 1x03 - Orion
Invasion (2021) 1x04 - The King is Dead
Invasion (2021) 1x05 - Going Home
Invasion (2021) 1x06 - Home Invasion
Invasion (2021) 1x07 - Hope
Invasion (2021) 1x08 - Contact
Invasion (2021) 1x09 - Full of Stars
Invasion (2021) 1x10 - First Day

您的语言过滤器不起作用,因为您试图从所有 HTML.

中查找 bt_descarga

bs4 有一个名为 parent 的属性。您可以使用 parent 属性访问元素的父级。 lang 也是 bs4 对象,您可以调用 bs4 属性。

因此,您应该到达过滤后的 lang class 的父 tr 标签并找到 bt_descarga。喜欢,

for lang in soup.findAll("td", class_="language"):
  if "Español (España)" in str(lang):
    for element in lang.parent.findAll("a", class_="bt_descarga"):
        results.append(element)