Python, BeautifulSoup или LXML - парсинг URL-адресов изображений из HTML с использованием тегов CSS - PullRequest
2 голосов
/ 23 ноября 2010

Я искал все выше и ниже, чтобы найти достойное объяснение того, как работают BeautifulSoup или LXML. Конечно, их документация великолепна, но для такого человека, как я, начинающий программист / программист, трудно расшифровать то, что я ищу.

В любом случае, как мой первый проект, я использую Python для анализа RSS-канала для ссылок на посты - я выполнил это с Feedparser. Мой план состоит в том, чтобы затем очистить изображения каждого сообщения. Хотя за всю жизнь я не могу понять, как заставить BeautifulSoup или LXML делать то, что я хочу! Я часами читал документацию и гуглил безрезультатно, поэтому я здесь. Ниже приведена строка из большой картины (мой скребок).

<div class="bpBoth"><a name="photo2"></a><img src="http://inapcache.boston.com/universal/site_graphics/blogs/bigpicture/shanghaifire_11_22/s02_25947507.jpg" class="bpImage" style="height:1393px;width:990px" /><br/><div onclick="this.style.display='none'" class="noimghide" style="margin-top:-1393px;height:1393px;width:990px"></div><div class="bpCaption"><div class="photoNum"><a href="#photo2">2</a></div>In this photo released by China's Xinhua news agency, spectators watch an apartment building on fire in the downtown area of Shanghai on Monday Nov. 15, 2010. (AP Photo/Xinhua) <a href="#photo2">#</a><div class="cf"></div></div></div>

Итак, согласно моему пониманию документации, я должен быть в состоянии передать следующее:

soup.find("a", { "class" : "bpImage" })

Чтобы найти все экземпляры с этим классом CSS. Ну, это ничего не возвращает. Я уверен, что пропускаю что-то тривиальное, поэтому я очень ценю ваше терпение.

Большое спасибо за ваши ответы!

Для будущих гуглеров я включу код моего фидпарсера:

#! /usr/bin/python

# RSS Feed Parser for the Big Picture Blog

# Import applicable libraries

import feedparser

#Import Feed for Parsing
d = feedparser.parse("http://feeds.boston.com/boston/bigpicture/index")

# Print feed name
print d['feed']['title']

# Determine number of posts and set range maximum
posts = len(d['entries'])

# Collect Post URLs
pointer = 0
while pointer < posts:
    e = d.entries[pointer]
    print e.link
    pointer = pointer + 1

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Используя lxml, вы можете сделать что-то вроде этого:

import feedparser
import lxml.html as lh
import urllib2

#Import Feed for Parsing
d = feedparser.parse("http://feeds.boston.com/boston/bigpicture/index")

# Print feed name
print d['feed']['title']

# Determine number of posts and set range maximum
posts = len(d['entries'])

# Collect Post URLs
for post in d['entries']:
    link=post['link']
    print('Parsing {0}'.format(link))
    doc=lh.parse(urllib2.urlopen(link))
    imgs=doc.xpath('//img[@class="bpImage"]')
    for img in imgs:
        print(img.attrib['src'])
1 голос
/ 23 ноября 2010

Использование pyparsing для поиска тегов довольно интуитивно понятно:

from pyparsing import makeHTMLTags, withAttribute

imgTag,notused = makeHTMLTags('img')

# only retrieve <img> tags with class='bpImage'
imgTag.setParseAction(withAttribute(**{'class':'bpImage'}))

for img in imgTag.searchString(html):
    print img.src
1 голос
/ 23 ноября 2010

Код, который вы опубликовали, ищет все элементы a с классом bpImage. Но ваш пример имеет класс bpImage для элемента img, а не a. Вам просто нужно сделать:

soup.find("img", { "class" : "bpImage" })
...