URL-адрес background-image, встроенный в класс div элемента BS4 - PullRequest
0 голосов
/ 28 февраля 2019

Я не специалист по утилизации, но мне удалось получить большую часть того, что я хочу.Тем не менее, мне трудно разобрать последнюю часть моего кода, фоновое изображение.

Это то, что у меня есть:

htmlSource.find('div', class_='flex-embed-content flex-embed-cover-image ')

Что возвращает:

<div class="flex-embed-content flex-embed-cover-image " style="background-image: url('//site.org/photos/0/kp/cr/QOKPCRqjkbbldlo-400x225-noPad.jpg?1528717310')"></div>

Я заинтересован в URL //site.org/photos/0/kp/cr/QOKPCRqjkbbldlo-400x225-noPad.jpg?1528717310

Как мне разобрать его из htmlSource?

Спасибо

Ответы [ 5 ]

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

Одно из решений использует urlextract.Этот класс поможет найти URL в строке.

Реализация:

from urlextract import URLExtract

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

extractor = URLExtract()

Код:

soup = BeautifulSoup(html,"lxml")
finddiv = htmlSource.find('div', class_='flex-embed-content flex-embed-cover-image')

style = finddiv['style']

for url in extractor.gen_urls(style):

    print (url)
    print('----')
    print('//'+url)

ВЫХОД:

site.org/photos/0/kp/cr/QOKPCRqjkbbldlo-400x225-noPad.jpg?1528717310
----
//site.org/photos/0/kp/cr/QOKPCRqjkbbldlo-400x225-noPad.jpg?1528717310
0 голосов
/ 01 марта 2019

Прежде всего вы должны получить свой элемент div, и есть много способов сделать это, но поскольку у вас есть действительно определенный класс, этого достаточно (здесь предполагается, что ваш HTML-код хранится в переменной htmlSource:

soup = BeautifulSoup(htmlSource, "html.parser")
divElement = soup.select_one('div.flex-embed-content.flex-embed-cover-image')

Теперь вы должны взять атрибут style и отфильтровать его по URL, и я предлагаю использовать регулярное выражение, и таким образом у вас не будет проблем с непредвиденными элементами, добавленными к стилю overtime.:

pattern = r"(?<=url\().*(?='\))"
url = re.search(pattern, divElement["style"]).group(0) # The group(0) is used to recover the whole match

Содержимое (?<=TEXT_BEFORE) в регулярном выражении предполагает, что наше совпадение начинается с этого содержимого TEXT_BEFORE, но не включает его в совпадение ( утверждение lookbegind ), а также(?=TEXT_AFTER) говорит об обратном и соответствует только в том случае, если соответствие следует за TEXT_AFTER ( прогнозное утверждение )

Таким образом, полный код будет:

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(html, "html.parser")
divElement = soup.select_one('div.flex-embed-content.flex-embed-cover-image')

pattern = r"(?<=url\().*(?='\))"
url = re.search(pattern, divElement["style"]).group(0)
0 голосов
/ 01 марта 2019

Атрибут style содержит CSS, который является чем-то красивым, который не умеет анализировать.

Итак, во-первых, получите содержимое атрибута style.Теперь вам нужно разобрать CSS.Вы можете разобрать его самостоятельно (ищите url(...)), что сработает, если сайт не сильно изменится.

Другой вариант - использовать выделенный синтаксический анализатор CSS, например tinycss .Я бы использовал синтаксический анализатор CSS, ваш код будет более устойчивым к изменениям сайта.

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

Я также новичок в изучении веб-страниц, вот решение вашей проблемы.

first=htmlSource.find('div', class_='flex-embed-content flex-embed-cover-image ')
get_style=first['style']
break_url=get_style.split(':')
break_url=break_url[1]
break_url=break_url.split("'")
final_url=break_url(1)
0 голосов
/ 28 февраля 2019

Получить атрибут стиля и использовать манипуляции со строками.Пример метода ниже (очевидно, есть и другие)

from bs4 import BeautifulSoup as bs

html = '''<div class="flex-embed-content flex-embed-cover-image " style="background-image: url('//site.org/photos/0/kp/cr/QOKPCRqjkbbldlo-400x225-noPad.jpg?1528717310')"></div>'''

soup = bs(html, 'lxml')

item = soup.select_one('div.flex-embed-content.flex-embed-cover-image')
item['style'].split("url('")[1][:-3]

Примечание. Я использую select_one, так как существует одно совпадение, основанное на вставленном html. Вы можете использовать select с селектором, включающим атрибут style div.flex-embed-content.flex-embed-cover-image[style]и петля.Я также хотел бы посмотреть, если вы можете уменьшить количество классов, используемых в селекторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...