python - 使用 BeautifulSoup 从维基百科获取特定图像

标签 python html css web-scraping beautifulsoup

我试图通过使用 BeautifulSoup 4 和 lxml 作为解析器从某些维基百科页面获取特定图像。例如,我正在尝试从此维基百科页面获取右侧的专辑封面: http://en.wikipedia.org/wiki/Animal_House_(U.D.O._album)

执行抓取的函数是这样的:

def get_cover_from_wikipedia(url):
    r = requests.get(url)
    if r.status_code == 200:
        soup = BeautifulSoup(r.content, 'lxml')
        elements = soup.find_all('a', class_='image')
        for element in elements:
            print '%s\n\n' % element.prettify()

    return False

打印输出如下:

<a class="image" href="/wiki/File:Question_book-new.svg">
 <img alt="" data-file-height="204" data-file-width="262" height="39" src="//upload.wikimedia.org/wikipedia/en/thumb/9/99/Question_book-new.svg/50px-Question_book-new.svg.png" srcset="//upload.wikimedia.org/wikipedia/en/thumb/9/99/Question_book-new.svg/75px-Question_book-new.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/9/99/Question_book-new.svg/100px-Question_book-new.svg.png 2x" width="50"/>
</a>

<a class="image" href="/wiki/File:UDO_animal_house.jpg">
 <img alt="" data-file-height="302" data-file-width="300" height="221" src="//upload.wikimedia.org/wikipedia/en/thumb/4/4e/UDO_animal_house.jpg/220px-UDO_animal_house.jpg" srcset="//upload.wikimedia.org/wikipedia/en/4/4e/UDO_animal_house.jpg 1.5x, //upload.wikimedia.org/wikipedia/en/4/4e/UDO_animal_house.jpg 2x" width="220"/>
</a>

我要拉出的图片是第二 block 中以<a class...开头的图片, 而不是第一个 block 中的图像的书本图像

我想在这里完成的是:

  1. 我只想获取 src 指定的链接,而不是类(class)附带的所有内容。

  2. 我希望能够区分图书图像和我想要拉出的图像。书的图片在那里,因为如果你查看维基百科页面,它说这篇文章需要引用,那里有一张书的图片。显然它符合我对标签 a 的搜索和类 image但它可能存在也可能不存在,具体取决于所讨论的文章。

什么是只获取我感兴趣的图像的最佳方法,即文章右侧的图像?

最佳答案

您的搜索不够具体。图书图像嵌套在元数据表中:

<table class="metadata plainlinks ambox ambox-content ambox-Refimprove" role="presentation">

当专辑封面嵌套在另一个里面时:

<table class="infobox vevent haudio" style="width:22em">

充分利用它。

使用 CSS selector support使这变得微不足道:

covers = soup.select('table.infobox a.image img[src]')
for cover in covers:
    print cover['src']

CSS 选择器要求 <img>带有 src 的标签属性,前提是它们嵌套在 <a class="image"> 中元素,在 <table class="infobox"> 内元素。只有一张这样的图片:

>>> from bs4 import BeautifulSoup
>>> import requests
>>> r = requests.get('http://en.wikipedia.org/wiki/Animal_House_(U.D.O._album)')
>>> soup = BeautifulSoup(r.content)
>>> covers = soup.select('table.infobox a.image img[src]')
>>> for cover in covers:
...     print cover['src']
... 
//upload.wikimedia.org/wikipedia/en/thumb/4/4e/UDO_animal_house.jpg/220px-UDO_animal_house.jpg

关于python - 使用 BeautifulSoup 从维基百科获取特定图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28006690/

相关文章:

javascript - 延迟加载不显示在屏幕上 img

html - @media only 屏幕不适用于移动设备

python - 查找(开始:end) positions that sublists occur within a list . Python

python - 如何在 Python 中从此 JSON 中获取 'url' 变量

html - HTTP 后 : url parameters and form data

PHP 表单处理和浏览器行为

html - 样式化 <select> 菜单

python - 如何生成浏览器

python - 在 Numpy 数组子类中更改 `__getitem__` 和 `__setitem__` 的行为

javascript - 无法设置属性值 'innerHTML' : object is null or undefined