BeautifulSoap получает несколько элементов для всех img в div с определенным классом - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь получить ссылки в атрибуте image-file (относительная ссылка как есть) в img тегах под div с id previewImages (я не хочу ссылку src).

Вот пример HTML:

<div id="previewImages">
  <div class="thumb"> <a><img src="https://example.com/s/15.jpg" image-file="/image/15.jpg" /></a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/2.jpg" image-file="/image/2.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/0.jpg" image-file="/image/0.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/3.jpg" image-file="/image/3.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/4.jpg" image-file="/image/4.jpg" /> </a> </div>
</div>

Я попробовал следующее, но оно дает мне только первую ссылку, а не все:

import sys
import urllib2
from bs4 import BeautifulSoup

quote_page = sys.argv[1] # this should be the first argument on the command line
page = urllib2.urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')

images_box = soup.find('div', attrs={'id': 'previewImages'})
if images_box.find('img'):
    imagesurl = images_box.find('img').get('image-file')
print imagesurl

Как я могуполучить все ссылки в image-file attritube для img тегов в div с class previewImages?

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Я думаю, что быстрее использовать id с селектором атрибута, переданным в select

from bs4 import BeautifulSoup as bs
html = '''
<div id="previewImages">
  <div class="thumb"> <a><img src="https://example.com/s/15.jpg" image-file="/image/15.jpg" /></a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/2.jpg" image-file="/image/2.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/0.jpg" image-file="/image/0.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/3.jpg" image-file="/image/3.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/4.jpg" image-file="/image/4.jpg" /> </a> </div>
</div>
'''
soup = bs(html, 'lxml')
links = [item['image-file'] for item in soup.select('#previewImages [image-file]')]
print(links)
1 голос
/ 29 марта 2019

Использование .findAll

Пример:

from bs4 import BeautifulSoup

html = """<div id="previewImages">
  <div class="thumb"> <a><img src="https://example.com/s/15.jpg" image-file="/image/15.jpg" /></a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/2.jpg" image-file="/image/2.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/0.jpg" image-file="/image/0.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/3.jpg" image-file="/image/3.jpg" /> </a> </div>
  <div class="thumb"> <a><img src="https://example.com/s/4.jpg" image-file="/image/4.jpg" /> </a> </div>
</div>"""

soup = BeautifulSoup(html, "html.parser")
images_box = soup.find('div', attrs={'id': 'previewImages'})
for link in images_box.findAll("img"):
    print link.get('image-file')

Выход:

/image/15.jpg
/image/2.jpg
/image/0.jpg
/image/3.jpg
/image/4.jpg
0 голосов
/ 29 марта 2019

Добавить, если в случае, если мы делаем тот же сценарий с lxml,

import lxml.html
tree = lxml.html.fromstring(sample)
images = tree.xpath("//img/@image-file")
print(images)

Выход ['/image/15.jpg', '/image/2.jpg', '/image/0.jpg', '/image/3.jpg', '/image/4.jpg']

0 голосов
/ 29 марта 2019

BeautifulSoup имеет метод .find_all() - отметьте документы .Вот как вы можете использовать его в своем коде:

import sys
import urllib2
from bs4 import BeautifulSoup

quote_page = sys.argv[1] # this should be the first argument on the command line
page = urllib2.urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')

images_box = soup.find('div', attrs={'id': 'previewImages'})
links = [img['image-file'] for img in images_box('img')]

print links   # in Python 3: print(links)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...