Python: BeautifulSoup извлекает текст из тега привязки
Я хочу извлечь текст из следующего источника тега image и текста тега привязки, который находится внутри данных класса div.
Мне удалось извлечь img src, но у меня возникли проблемы при извлечении текста из тега привязки.
<a class="title" href="http://rads.stackru.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
Вот ссылка на всю страницу HTML
Вот мой код
for div in soup.findAll('div', attrs={'class':'image'}):
print "\n"
for data in div.findNextSibling('div', attrs={'class':'data'}):
for a in data.findAll('a', attrs={'class':'title'}):
print a.text
for img in div.findAll('img'):
print img['src']
То, что я пытаюсь сделать, это извлечь изображение src (ссылка) и заголовок в стороне div class=data.
так например
<a class="title" href="http://rads.stackru.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
Я хочу извлечь: Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)
8 ответов
Все вышеперечисленные ответы действительно помогают мне составить свой ответ, поэтому я проголосовал за все ответы, которые выдавали другие пользователи: Но я наконец собрал свой собственный ответ на конкретную проблему, с которой я имел дело:
Поскольку вопрос четко определен, мне нужно было получить доступ к некоторым братьям и сестрам и их дочерним элементам в структуре dom: это решение будет перебирать изображения в структуре dom и создавать имя изображения с использованием названия продукта и сохранять изображение в локальном каталоге.
import urlparse
from urllib2 import urlopen
from urllib import urlretrieve
from BeautifulSoup import BeautifulSoup as bs
import requests
def getImages(url):
#Download the images
r = requests.get(url)
html = r.text
soup = bs(html)
output_folder = '~/amazon'
#extracting the images that in div(s)
for div in soup.findAll('div', attrs={'class':'image'}):
modified_file_name = None
try:
#getting the data div using findNext
nextDiv = div.findNext('div', attrs={'class':'data'})
#use findNext again on previous object to get to the anchor tag
fileName = nextDiv.findNext('a').text
modified_file_name = fileName.replace(' ','-') + '.jpg'
except TypeError:
print 'skip'
imageUrl = div.find('img')['src']
outputPath = os.path.join(output_folder, modified_file_name)
urlretrieve(imageUrl, outputPath)
if __name__=='__main__':
url = r'http://www.amazon.com/s/ref=sr_pg_1?rh=n%3A172282%2Ck%3Adigital+camera&keywords=digital+camera&ie=UTF8&qid=1343600585'
getImages(url)
Это поможет:
from bs4 import BeautifulSoup
data = '''<div class="image">
<a href="http://www.example.com/eg1">Content1<img
src="http://image.example.com/img1.jpg" /></a>
</div>
<div class="image">
<a href="http://www.example.com/eg2">Content2<img
src="http://image.example.com/img2.jpg" /> </a>
</div>'''
soup = BeautifulSoup(data)
for div in soup.findAll('div', attrs={'class':'image'}):
print(div.find('a')['href'])
print(div.find('a').contents[0])
print(div.find('img')['src'])
Если вы ищете продукты Amazon, то вы должны использовать официальный API. Существует, по крайней мере, один пакет Python, который облегчит ваши задачи по очистке и сохранит вашу активность в рамках условий использования.
В моем случае это сработало так:
from BeautifulSoup import BeautifulSoup as bs
url="http://blabla.com"
soup = bs(urllib.urlopen(url))
for link in soup.findAll('a'):
print link.string
Надеюсь, поможет!
Я бы предложил пойти по маршруту lxml и использовать xpath.
from lxml import etree
# data is the variable containing the html
data = etree.HTML(data)
anchor = data.xpath('//a[@class="title"]/text()')
Чтобы получить href из тега привязки, используйте
tag.get("href")
и чтобы получить img src, который вы используете
tag.img.get("src")
.
Пример, используя эти данные:
data = """
<div class="image">
<a href="http://www.example.com/eg1">Content1<img src="http://image.example.com/img1.jpg" /></a>
</div>
<div class="image">
<a href="http://www.example.com/eg2">Content2<img src="http://image.example.com/img2.jpg" /> </a>
</div>
"""
Получите ссылки и тексты:
import requests
from bs4 import BeautifulSoup
def get_soup(url):
response = requests.get(url)
if response.ok:
return BeautifulSoup(response.text, features="html.parser")
def get_links(soup):
links = []
for tag in soup.findAll("a", href=True):
if img := tag.img:
img = img.get("src")
links.append(dict(url=tag.get("href"), text=tag.text, img=img))
return links
# soup = get_soup('www.example.com')
soup = BeautifulSoup(data, features="html.parser")
links = get_links(soup)
Выходы:
[{'url': 'http://www.example.com/eg1', 'text': 'Content1', 'img': 'http://image.example.com/img1.jpg'},
{'url': 'http://www.example.com/eg2', 'text': 'Content2 ', 'img': 'http://image.example.com/img2.jpg'}]
print(link_addres.contents[0])
Он напечатает контекст якорных тегов
пример:
statement_title = statement.find('h2',class_='briefing-statement__title')
statement_title_text = statement_title.a.contents[0]
>>> txt = '<a class="title" href="http://rads.stackru.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a> '
>>> fragment = bs4.BeautifulSoup(txt)
>>> fragment
<a class="title" href="http://rads.stackru.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
>>> fragment.find('a', {'class': 'title'})
<a class="title" href="http://rads.stackru.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
>>> fragment.find('a', {'class': 'title'}).string
u'Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)'