【问题标题】:Scraping the news (Python 3.6, BeautifulSoup)抓取新闻(Python 3.6,BeautifulSoup)
【发布时间】:2017-06-18 04:05:41
【问题描述】:

我想抓取spiegel.de/schlagzeilen 以获取显示在日期下方的所有新闻(今天、昨天、到几天前)。

<div class="schlagzeilen-content schlagzeilen-overview"> 

包含我想要的,我想,但还有一个问题:

print(data)

保留我需要的数据,但此外它还带有一堆我不想要的短语(如集成模块的名称/HTML/CSS 的部分等)

所以我选择了

for item in data:
    print(item.text)

这个有一个非常漂亮的输出(!),但现在我错过了文章 URL,这是很重要的。有没有人可以帮助我?这是我的代码:

from bs4 import BeautifulSoup
import requests

website = 'http://spiegel.de/schlagzeilen'
r = requests.get(website)
soup = BeautifulSoup((r.content), "lxml")

data = soup.find_all("div", {"class": "schlagzeilen-content schlagzeilen-overview"})

for item in data:
    print(item.text)

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup


    【解决方案1】:

    您可以使用 CSS selector 查找所有文章链接:

    from bs4 import BeautifulSoup
    import requests
    
    website = 'http://spiegel.de/schlagzeilen'
    r = requests.get(website)
    soup = BeautifulSoup((r.content), "lxml")
    
    # data = soup.find_all("div", {"class": "schlagzeilen-content schlagzeilen-overview"})
    links = soup.select('div.schlagzeilen-content a')
    
    for item in links:
        print item.text, website + item['href']
    

    一些输出:

    Bayern: Sechs Tote in Gartenlaube - keine Hinweise auf Gewaltverbrechen http://spiegel.de/schlagzeilen/panorama/justiz/tote-in-gartenlaube-keine-hinweise-auf-gewaltverbrechen-a-1132268.html
    Starbucks, Tesla, GE: Trumps Einreiseverbot beunruhigt US-Konzerne http://spiegel.de/schlagzeilen/wirtschaft/soziales/donald-trump-und-das-einreiseverbot-us-konzerne-zeigen-sich-besorgt-a-1132262.html
    ...
    

    【讨论】:

    • 亲爱的 Shane - 非常感谢这个很棒的回复和解释。这不再起作用了。我尝试为 Python 3 进行锻炼,但第一次失败了。有什么想法可以将此解决方案移植到更新的时间!?期待收到您的来信 - 问候。
    【解决方案2】:
    from bs4 import BeautifulSoup
    import requests
    from urllib.parse import urljoin
    
    website = 'http://spiegel.de/schlagzeilen'
    r = requests.get(website)
    soup = BeautifulSoup((r.content), "lxml")
    
    div = soup.find("div", {"class": "schlagzeilen-content schlagzeilen-overview"})
    
    for a in div.find_all('a', title=True):
        link = urljoin(website, a.get('href'))
        print(a.text, a.find_next_sibling('span').text)
        print(link)
    

    出来:

    Südafrika: Dutzende Patienten sterben nach Verlegung (Panorama, 13:09)
    http://spiegel.de/panorama/gesellschaft/suedafrika-verlegung-in-privatkliniken-dutzende-patienten-gestorben-a-1132677.html
    Trumps Stotterstart: Ein Präsident, so unbeliebt wie keiner zuvor (Politik, 12:59)
    http://spiegel.de/politik/ausland/donald-trump-als-us-praesident-so-unbeliebt-wie-kein-vorgaenger-a-1132554.html
    Kontrolle von Gefährdern: Kabinett beschließt elektronische Fußfessel (Politik, 12:33)
    

    你需要的标签是a标签,它的兄弟span包含(Netzwelt, 12:23),所以只需使用find_all并使用a标签作为锚。

    如果你想要网址的完整路径,请使用urljoin

    【讨论】:

    • 亲爱的朋友 - 非常感谢这个很棒的回复和解释。这不再起作用了。我尝试为 Python 3 进行锻炼,但第一次失败了。有什么想法可以将此解决方案移植到更新的时间!?期待收到您的来信 - 问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2018-01-13
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多