【问题标题】:Python Web Scraper gives the same page as the responsePython Web Scraper 给出与响应相同的页面
【发布时间】:2020-06-30 23:16:22
【问题描述】:

我编写了一个 Python 代码来从网站上抓取数据。它似乎不像它应该做的那样工作。我想从页面中获取所有文章,但我多次从第一篇文章中获取一个段落。我看不出代码有什么问题。如果您知道问题出在哪里,请帮我解决它。

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.

【问题讨论】:

    标签: python html web


    【解决方案1】:

    for-loop 中,您必须使用page.text 而不是html

    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 - 这个变量有来自子页面的 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()
    

    【讨论】:

    • 嗨 Furas :非常感谢您对一个有趣问题的出色回答。非常感谢您保存到 csv 文件的想法:这非常有帮助 - 也在这里 - 在我们都建立的伟大工作中:stackoverflow.com/questions/62595317/… - 我想我必须更深入地挖掘你的想法和方法- 我需要设置 selenium-session 以使用 bs4 - 或者你会说什么?! - 期待收到你的回复。问候零
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2018-12-10
    • 2021-10-29
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多