Красивый суп не может извлечь HTML из страниц при открытии ссылок из файла - PullRequest
0 голосов
/ 24 мая 2018

У меня есть несколько веб-ссылок в файле article_links.txt, которые я хочу открыть одну за другой, извлечь их текст и распечатать.Мой код для этого:

import requests
from inscriptis import get_text
from bs4 import BeautifulSoup

links = open(r'C:\Users\h473\Documents\Crawling\article_links.txt', "r")

for a in links:
    print(a)
    page = requests.get(a)
    soup = BeautifulSoup(page.text, 'lxml')
    html = soup.find(class_='article-wrap')
    if html==None:
        html = soup.find(class_='mag-article-wrap')

    text = get_text(html.text)

    print(text)

Но я получаю сообщение об ошибке: ---> text = get_text(html.text)

AttributeError: 'NoneType' object has no attribute 'text'

Итак, когда я распечатал soup переменная, чтобы увидеть, что такое содержание.Вот что я нахожу для каждой ссылки:

http://www3.asiainsurancereview.com//Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Bad Request</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/></head>
<body><h2>Bad Request - Invalid URL</h2>
<hr/><p>HTTP Error 400. The request URL is invalid.</p>
</body></html>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Bad Request</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/></head>
<body><h2>Bad Request - Invalid URL</h2>
<hr/><p>HTTP Error 400. The request URL is invalid.</p>
</body></html>

Итак, я попытался извлечь текст из ссылок по отдельности, например, так:

import requests
from inscriptis import get_text
from bs4 import BeautifulSoup

page = requests.get('http://www3.asiainsurancereview.com//Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law')
soup = BeautifulSoup(page.text, 'lxml')
html = soup.find(class_='article-wrap')
if html==None:
    html = soup.find(class_='mag-article-wrap')
text = get_text(html.text)
print(text)

И это прекрасно работает!Итак, я попытался дать ссылки в виде списка / массива и попытался извлечь текст из каждого из них:

import requests
from inscriptis import get_text
from bs4 import BeautifulSoup

links = ['http://www3.asiainsurancereview.com//Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law',
'http://www3.asiainsurancereview.com//Mock-News-Article/id/42946/Type/eDaily/India-M-A-deals-brewing-in-insurance-sector',
'http://www3.asiainsurancereview.com//Mock-News-Article/id/42947/Type/eDaily/China-Online-insurance-premiums-soar-31-in-1Q2018',
'http://www3.asiainsurancereview.com//Mock-News-Article/id/42948/Type/eDaily/South-Korea-Courts-increasingly-see-65-as-retirement-age',
'http://www3.asiainsurancereview.com//Magazine/ReadMagazineArticle/aid/40847/Creating-a-growth-environment-for-health-insurance-in-Asia']

#open(r'C:\Users\h473\Documents\Crawling\article_links.txt', "r")

for a in links:
    print(a)
    page = requests.get(a)
    soup = BeautifulSoup(page.text, 'lxml')
    html = soup.find(class_='article-wrap')
    if html==None:
        html = soup.find(class_='mag-article-wrap')

    text = get_text(html.text)

    print(text)

И это тоже прекрасно работает!Итак, что же не так при извлечении ссылок из текстового файла?И как это исправить?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Проблема в том, что ваши URL недействительны, потому что все они заканчиваются символом новой строки.Вы можете видеть то же самое, как это:

>>> page = requests.get('http://www3.asiainsurancereview.com//Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law\n')
>>> page
<Response [400]>
>>> page.text
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>

BeautifulSoup прекрасно разбирает этот HTML.Это просто не очень полезный HTML.И, в частности, он не имеет ничего с классом article-wrap или классом mag-article-wrap, поэтому оба ваших find возвращают None.И у вас нет обработки ошибок для этого случая;вы просто пытаетесь использовать значение None, как если бы это был элемент HTML, отсюда и исключение.

Вы должны были заметить это при печати каждой a: после каждой строки есть дополнительная пустая строка.Это либо означает, что в строках есть символы новой строки (что на самом деле и происходит), либо между пустыми строками есть пустые строки (что будет еще более недопустимым URL-адресом) - вы получите ConnectionError или некоторый подклассиз этого).


То, что вы хотите сделать, просто: просто уберите переводы строк с каждой строки:

for a in links:
    a = a.rstrip()
    # rest of your code
0 голосов
/ 24 мая 2018

Попробуйте:

with f open("sample.txt"):
    for line in f:
        print(line)
0 голосов
/ 24 мая 2018

Я не знаю, что в вашем файле.Но, по моему мнению, в вашем файле может быть новая пустая строка, которая вызывает объект NoneType

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...