首页 > 解决方案 > 网页抓取文章得到 AttributeError: 'str' object has no attribute 'text'

问题描述

我正在尝试从中提取所有文章的标题、链接、日期atlasobscura.com

一开始我是在requests + parsel + xpath中编写代码的。(结果没有错误)

但这次我使用 BeautifulSoup 重新编写代码,我得到了AttributeError: 'str' object has no attribute 'text'.

回溯(最后一次调用):文件“E:\Python\Atlasobscura.com_2.py”,第 21 行,在 href = 'https://www.atlasobscura.com' + str(s.find('div') .find('a')['href'].text) AttributeError: 'str' object has no attribute 'text'

如果有人能解决这个问题。

请帮我。

谢谢!

这是代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd

title = []
link = []
date = []

for x in range(1, 662):
    print(f'=====> Scraping from page {x}')
    url = f'https://www.atlasobscura.com/articles?page={x}'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
    r = requests.get(url, headers=headers)
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, 'lxml')
    
    articles = soup.find_all('div', class_='col-md-4 col-sm-6 col-xs-12')
    for s in articles:
        story = s.find('div', class_='content-card-text').find('h3').find('span').text
        title.append(story)
        href = 'https://www.atlasobscura.com' + str(s.find('div').find('a')['href'].text)
        link.append(href)
        m_d_y = s.find('div', class_='detail-sm article-card-detail article-card-date').text.strip()
        date.append(m_d_y)
        print(story, href, m_d_y)

    atlasobscura = pd.DataFrame({
        'Title': title,
        'Link': link,
        'Date': date
    })
    atlasobscura.to_excel('Atlasobscura.com.xlsx', index=False)

标签: pythonweb-scrapingbeautifulsoup

解决方案


根据 Traceback,问题就在这里

str(s.find('div').find('a')['href'].text)

s是一个网页元素。应用find()它会给出另一个网络元素所以在应用之后

s.find('div').find('a')

我们有一些网络元素。现在我们应用['href']它,这给出了href该 web 元素的属性值。所以

s.find('div').find('a')['href']

返回一些字符串。
我们不能.text对字符串应用方法。
这就是错误所说的。
因此,您应该简单地删除.text那里,将其保留为:

href = 'https://www.atlasobscura.com' + str(s.find('div').find('a')['href'])

.text方法可以应用于 Web 元素对象以获取其文本值。


推荐阅读