2017-02-20 1 views
0

В python у меня есть программа, которая возвращает из списка URL-адреса.Хотите вернуть <title> тег, но возвратите <title> bad request <.title> Python 3

Некоторые из них возвращаются Bad Request, когда они собираются вместе, в списке

Например я загрузить два URL в в текстовый файл:

http://www.scientific.net/MSF 
http://www.scientific.net/JMNM 

это возвращение:

<title>Bad Request</title> 
<title>Journal of Metastable and Nanocrystalline Materials</title> 

Код работает нормально, если у меня есть только первый URL-адрес в списке. Как заставить его получить оба заголовка вместо плохого запроса?

Мой код:

url_list= [] 

f = open('test.txt','r') #text file with url 
for line in f: 
    url_list.append(line) 

for link in url_list: 
    try: 
     r = requests.get(link) 
     soup = BeautifulSoup(r.content,"html.parser") 
     title = soup.title 
     title.string = title.get_text(strip = True) 
     print(str(title)) 

    except: 
     print("No Title Found ") 
     continue 

ответ

1

Ваша проблема возникает из-за чтения из текстового файла. В цикле for link in url_list ваше первое значение для link будет http://www.scientific.net/MSF\n - \n в конце приводит к ошибке Bad Request. Разделите \n от строк по мере их чтения, и ваш код будет работать. Кажется, что в вашей последней строке нет \n, поэтому простое использование url_list.append(line[:-1]) не удастся для последней строки.

0
r = requests.get(link) 
    soup = BeautifulSoup(r.content,"html.parser") 
    #title = soup.title 
    titles = soup.find_all('title') 
    for title in titles: 
     title.string = title.get_text(strip = True) 
     print(str(title)) 

. является аббревиатурой для .find(), он будет возвращать первый матч, вы должны использовать find_all() вернуть все вышлет.