Python Web Scraperは応答と同じページを提供します

2020-07-01 python html web

サイトからデータをこするためにpythonコードを書きました。本来の方法では動作しないようです。ページからすべての記事を取得したいのですが、最初の記事から1つの段落を複数回取得します。コードのどこが悪いのかわかりません。問題がわかっている場合は、修正を手伝ってください。

import requests
from bs4 import BeautifulSoup

URL = 'https://zdravi.doktorka.cz/clanky?page=0'

HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}

HOST = 'https://zdravi.doktorka.cz'

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('article', class_='node-teaser-display')

    articles = []
    for item in items:
        articles.append({
            HOST + item.find('a').get('href'),
            
        })
        
    arts = []
    
    for each in articles:
        b = ''.join(each)
        arts.append(b)

    for art in arts:
        page = get_html(art)
        pagesoup = BeautifulSoup(html, 'html.parser')
        parags = pagesoup.find('p').get_text()
        print(art)
        print(parags)

def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error')
parse()

これは応答です:

https://zdravi.doktorka.cz/infekcnost-bezpriznakovych-nosicu-covid-19-muze-byt-slaba-naznacuje-studie
Jsme tým lékařů, terapeutů, kosmetiček, odborníků pracujících ve zdravotnictví, v oboru fitness a ekologie. Náš web funguje od roku 1999 a patří mezi nejnavštěvovanější weby zabývající se zdravým životním stylem v ČR.
https://zdravi.doktorka.cz/pri-operativni-lecbe-sedeho-zakalu-existuji-tri-moznosti
Jsme tým lékařů, terapeutů, kosmetiček, odborníků pracujících ve zdravotnictví, v oboru fitness a ekologie. Náš web funguje od roku 1999 a patří mezi nejnavštěvovanější weby zabývající se zdravým životním stylem v ČR.
https://zdravi.doktorka.cz/epidemiolog-varuje-pred-dlouhodobym-nosenim-rousek
Jsme tým lékařů, terapeutů, kosmetiček, odborníků pracujících ve zdravotnictví, v oboru fitness a ekologie. Náš web funguje od roku 1999 a patří mezi nejnavštěvovanější weby zabývající se zdravým životním stylem v ČR.
https://zdravi.doktorka.cz/jidlo-muze-prozradit-na-co-mate-alergii
Jsme tým lékařů, terapeutů, kosmetiček, odborníků pracujících ve zdravotnictví, v oboru fitness a ekologie. Náš web funguje od roku 1999 a patří mezi nejnavštěvovanější weby zabývající se zdravým životním stylem v ČR.
https://zdravi.doktorka.cz/jak-muzeme-nyni-posilit-svou-imunitu
Jsme tým lékařů, terapeutů, kosmetiček, odborníků pracujících ve zdravotnictví, v oboru fitness a ekologie. Náš web funguje od roku 1999 a patří mezi nejnavštěvovanější weby zabývající se zdravým životním stylem v ČR.

Answers

forループでは、 htmlではなくpage.textを使用する必要があります

for art in arts:
    page = get_html(art)
    pagesoup = BeautifulSoup(page.text, 'html.parser')
    parags = pagesoup.find('p').get_text()
    print(art)
    print(parags)

htmlにはメインページからのHTMLがあるため、常に同じHTMLを解析しました。しかし、後でサブページから新しい応答を受け取り、変数page割り当てpage -この変数にはサブページからのHTMLがあります。

ところで、おそらくprint( html )チェックすると表示されるでしょう。


編集:その他の変更とファイル.csvへの保存を含む完全に機能するコード

import requests
from bs4 import BeautifulSoup
import csv

URL = 'https://zdravi.doktorka.cz/clanky?page=0'

HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}

HOST = 'https://zdravi.doktorka.cz'

def get_soup(url, headers=HEADERS, params=None):
    r = requests.get(url, headers=headers, params=params)
    
    if r.status_code != 200:
        print('Error:', r.status_code, url)
        return

    return BeautifulSoup(r.text, 'html.parser')

def get_content(soup):
    
    data = []
    
    articles = soup.find_all('article', class_='node-teaser-display')

    for item in articles:
        url = HOST + item.find('a').get('href')
        print(url)
        
        soup = get_soup(url)
        if soup:
        
            paragraph = soup.find('p').get_text().strip()
            print(paragraph)
  
            data.append({
                'url': url,
                'paragraph': paragraph,
            })
    
        print('---')
        
    with open('output.csv', 'w') as fh:
        csv_writer = csv.DictWriter(fh, ['url', 'paragraph'])
        csv_writer.writeheader()
        csv_writer.writerows(data)           
        
def parse():
    soup = get_soup(URL)
    if soup:
        get_content(soup)
       
if __name__ == '__main__':        
    parse()

Related