Title сайтов из списка в файле

Можно ли, чтобы r = requests.get брал адреса сайтов из файла? Или же мне надо создать массив с адресами сайтов? Там просто их более 400

import requests
from lxml import html
from bs4 import BeautifulSoup

with open("sites.txt", "r") as fp:
    lines = fp.readlines()



r = requests.get(lines)


with open('html.html', 'w', encoding="utf-8") as output_file:
        output_file.write(r.text)


html = open('html.html', encoding="utf-8").read()
soup = BeautifulSoup(html, 'lxml')


title = soup.find('title')

print(title)

Мне нужен title всех сайтов из списка


Ответы (1 шт):

Автор решения: gil9red

Можно ли, чтобы r = requests.get брал адреса сайтов из файла? Или же

Нельзя, он принимает только строку-адрес сайта

мне надо создать массив с адресами сайтов?

Угу (вариант с .readlines()), либо, если серьезные ограничения по памяти, то можно сделать перебор строк из файла в цикле

Пример:

import requests
from bs4 import BeautifulSoup

with open("sites.txt") as f:
    lines = f.readlines()

for line in lines:
    url = line.strip()

    rs = requests.get(url)
    soup = BeautifulSoup(rs.content, 'html.parser')

    title = soup.find('title')
    print(title.get_text(strip=True))

PS.

  • url = line.strip() тут strip используется, чтобы убрать пробелы и символы перехода на новую строку \n, а readlines обязательно их вернет

  • soup = BeautifulSoup(rs.content, 'html.parser')

    • нет смысла сохранять в файл ответ от запроса, поэтому сразу используется
    • rs.content возвращает ответ как байтовый массив, это даст BeautifulSoup самому определить кодировку из ответа
    • 'html.parser' это питоничий парсер html, нет нужды использовать сторонние библиотеки, типа lxml
  • get_text(strip=True) метод возвращает текстовое представление элемента с удалением пробельных символов (аналог .strip())

→ Ссылка