【问题标题】:bs4 scraping selection inside objectbs4在对象内抓取选择
【发布时间】:2022-01-10 20:23:13
【问题描述】:

这是我第一次尝试用 beautifulsoup 从网上抓取一些字幕。这离我的目标还很远,但就目前而言,我只是想实现这一点(我正在慢慢学习: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,因为那里有一个JS 事件监听器。换句话说,没有指向 HTML 源文件的链接。
  • 没错。但这将是“未来”的一个问题,这就是为什么我说它还远未完成:D

标签: python beautifulsoup urllib


【解决方案1】:

您的语言过滤器不起作用,因为您试图从所有 HTML 中查找 bt_descarga。

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

因此,您应该到达过滤后的 lang 类的父 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)

【讨论】:

    【解决方案2】:

    如果你想要的只是西班牙语字幕(因为没有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2017-05-10
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2021-08-11
      • 2021-04-21
      相关资源
      最近更新 更多