Вы можете выбрать весь текст HTML-тега, чтобы получить все внутри каждой ссылки эпизода, т.е. select_one('html').text
.Это кажется намного проще.
Вы можете использовать селектор атрибута css = значение с оператором ^
(чтобы указать, что значение атрибута начинается с подстроки справа от =
), чтобы собрать все начальные ссылки эпизода, т.е.[href^='season']
.
Поскольку вы делаете много звонков, вы можете повторно использовать соединение с сеансом.Я полагаю, что многопроцессорность может быть хорошей идеей и здесь.
import requests
import pandas as pd
from bs4 import BeautifulSoup
import ftfy
session = requests.Session()
def makeSoup(url):
res = session.get(url,timeout=5)
res.raise_for_status()
soup_content = BeautifulSoup(res.content, "lxml")
for style in soup_content(["style"]):
style.decompose()
return soup_content
url = "https://fangj.github.io/friends/"
soup = makeSoup(url)
links = [url + link['href'] for link in soup.select("[href^='season']")]
results = [[link.split('season/')[1].split('.html')[0], makeSoup(link).select_one('html').text] for link in links]
df = pd.DataFrame(results)
for index, row in df.iterrows():
with open('data/' + row[0] + '.txt', 'w', encoding='utf-8') as file:
file.write(ftfy.fix_text(row[1]))
Вы можете сделать то, что вам нужно, с полученным текстом.