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

我试图通过使用带有lxml的BeautifulSoup 4作为解析器来从某些Wikipedia页面获取特定图像。 例如,我试图从这个维基百科页面获取专辑封面:http://en.wikipedia.org/wiki/Animal_House_(UDO_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 '%snn' % 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>

我想要拉出的图像是以<a class...开头的第二个区块中的图像,而不是第一个区块中图像的书籍图像

我想在这里完成的是:

  • 我只想获得用src指定的链接,而不是类中的所有内容。

  • 我希望能够区分书籍图像和我想要拉出的图像。 这本书的图像就在那里,因为如果你检查维基百科页面,它说文章需要引文,并且那里有一本书图像。 显然,它符合我的标签搜索a和阶级image ,但它可能会或可能不会有因有问题的文章。

  • 什么是最好的方式来获得我只感兴趣的图像,这是在文章右侧的图像?


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

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

    而专辑封面嵌入另一个:

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

    使用它你的优势。

    使用CSS选择器支持使得这个微不足道:

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

    CSS选择器要求带有src属性的<img>标签,只要它们嵌套在<table class="infobox">元素中的<a class="image">元素中。 只有一个这样的形象:

    >>> 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
    

    那么你已经得到了你想要的99%,所以这是主要的。 我的第一个想法是稍微收紧你的过滤器。 如果这是一次性案例,并且您不需要此程序在许多地方应用,那么BeautifulSoup.find_all()中的“文本”参数可以帮助您:

    if r.status_code == 200:
        soup = BeautifulSoup(r.content, 'lxml')
        elements = soup.find_all('a', text='.jpg' class_='image')
        for element in 
            print '%snn' % element.prettify()
    
    return False
    

    由于您的目标图片是该页面上唯一的.jpg文件,因此这应该有所帮助。 你可能已经看过,但是如果你陷入困境,这应该会有所帮助:http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all

    链接地址: http://www.djcxy.com/p/62847.html

    上一篇: Getting a particular image from Wikipedia with BeautifulSoup

    下一篇: Wikipedia philosophy game diagram in python and R