【问题标题】:I keep getting errors like 'ResultSet' object has no attribute 'get' and 'NoneType' object has no attribute 'get'我不断收到诸如“ResultSet”对象没有属性“get”和“NoneType”对象没有属性“get”之类的错误
【发布时间】:2016-11-25 04:17:26
【问题描述】:

我正在尝试抓取 youtube 水印元素 href 但我似乎无法抓取它。

如果我尝试

    def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find_all('a', {'class': 'ytp-watermark'})
        entries = video_row.get('href')

        return entries

我明白了

'ResultSet' object has no attribute 'get'

如果我尝试

        def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find('a', {'class': 'ytp-watermark'})
        entries = video_row.get('href')

        return entries

我明白了

'NoneType' object has no attribute 'get'

如果我尝试

        def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find('a', {'target': '_blank'})
        entries = video_row.get('href')[24]

        return entries

我得到一个字符

's'

如果我尝试

        def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find('a', {'target': '_blank'})[24]
        entries = video_row.get('href')

        return entries

我明白了

24

如果我尝试

        def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find('a', {'target': '_blank'})[24:]
        entries = video_row.get('href')

        return entries

我明白了

unhashable type: 'slice'

如果我尝试

def panties():
    from lxml import html
    pan_url = 'http://www.panvideos.com'
    shtml = requests.get(pan_url, headers=headers)
    soup = BeautifulSoup(shtml.text, 'html5lib')
    video_row = soup.find_all('div', {'class': 'video'})

    def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find('a', {'target': '_blank'})
        entries = [{'text': div.get('href'),
                    } for div in video_row][24]


    return entries

我明白了

'NavigableString' object has no attribute 'get'

如果我尝试

    def youtube_link(url):
        youtube_page = requests.get(url, headers=headers)

        soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
        video_row = soupdata.find_all('a', {'class': 'ytp-title-link'})
        entries = [{'text': div.get('href'),
                    } for div in video_row]

        return entries

我明白了

 []

如果我使用 chrome 检查并将鼠标悬停在我得到的水印上

        <a class="ytp-watermark yt-uix-sessionlink" target="_blank" aria-label="Watch on www.youtube.com" data-sessionlink="feature=player-watermark" href="https://www.youtube.com/watch?v=Xjww1pgKgnU" data-layer="7">
        <svg xmlns:xlink="http://www.w3.org/1999/xlink" height="100%" version="1.1" viewBox="0 0 77 34" width="100%">
            ........
        </svg>
    </a>

但如果我使用检查的搜索能力并输入 _blank 我会得到

<a class="ytp-title-link yt-uix-sessionlink" target="_blank" data-sessionlink="feature=player-title" href="https://www.youtube.com/watch?v=Xjww1pgKgnU">
        <span class="ytp-title-playlist-icon" style="display: none;">
        .....
        </span>
    <span>Packer Luther King Feat  Mgp the Saw -BIEN MALA (Video Oficial)</span></a>

这些都没有返回结果。我的语法错了吗?任何帮助将不胜感激

这是我的全部功能

def panties():
        from lxml import html
        pan_url = 'http://www.panvideos.com'
        shtml = requests.get(pan_url, headers=headers)
        soup = BeautifulSoup(shtml.text, 'html5lib')
        video_row = soup.find_all('div', {'class': 'video'})

        def youtube_link(url):
            youtube_page = requests.get(url, headers=headers)

            soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
            video_row = soupdata.find('a', {'class': 'ytp-title-link yt-uix-sessionlink'})
            entries = [{'text': div.get('href'),
                        } for div in video_row]


            return entries

        entries = [{'text': div.h4.text,
                    'href': div.a.get('href'),
                    'tube': youtube_link(div.a.get('href')),
                    } for div in video_row][:1]

        return entries

它获取一个 url,使用该 url 作为获取详细信息页面的一种方式,并从该页面获取该信息并返回它。由于某种原因,链接被返回为无。如果我尝试 find all 或 find 它不会返回单个 a 元素。但是如果我寻找 h1 它会起作用。

编辑我尝试了不同的解析器

html.parser、lxml 和 html5lib

编辑:

我相信无法抓取数据,因为它来自媒体播放器。当我这样做时

 video_row = soupdata.find_all('body')

我正在寻找的数据没有出现。所以这不是我,我不认为这是一个错误或任何无法通过正常方式获得的东西。链接标签元标签和其他一些标签无法抓取。

【问题讨论】:

  • 如果soupdata.find_all()返回[],则表示该元素在文档中不存在。也许水印是使用 JavaScript 动态添加的,在这种情况下它会出现在 Chrome 中,但不会出现在使用 requests.get() 下载的文档中。

标签: python django web-scraping beautifulsoup


【解决方案1】:

当我使用类的全部价值时,我得到了 href...

video_row = soupdata.find('a', {'class': 'ytp-watermark yt-uix-sessionlink'})

如果你想使用 findAll 你必须遍历条目。例如,为自己创建额外的列表 entries_final 并执行以下操作:

video_rows = soupdata.findAll('a', {'class': 'ytp-watermark yt-uix-sessionlink'})
entries_final = []
for row in video_rows:
    entries_final.append(row.get('href'))

然后return entries_final

【讨论】:

  • 当我尝试“NoneType”对象不可迭代时出现的错误如果我执行 find_all 它只返回方括号 []
  • 我的错误“NoneType”对象不可迭代。如果这有所作为,我将在 django 应用程序中使用它。而且我想要 youtube 链接而不是 panvideo 链接
  • 我开始认为该网站以某种方式阻止了我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多