findAll () в BeautifulSoup пропускает несколько идентификаторов - PullRequest
0 голосов
/ 17 мая 2018

У меня есть строка с несколькими идентификаторами в теге изображения:

<img id="webfast-uhyubv" alt="" data-type="image" id="comp-jefxldtzbalatamediacontentimage" src="http://webfast.co/images/webfast-logo.png" /> 

soup = bs4.BeautifulSoup(webpage,"html.parser")
images = soup.findAll('img')
for image in images:
    print image

Приведенный выше код возвращает только id=comp-jefxldtzbalatamediacontentimage

Замена

soup = bs4.BeautifulSoup(webpage,"html.parser")

на

soup = bs4.BeautifulSoup(webpage,"lxml")

возвращает первый идентификатор webfast-uhyubv

Однако я хочу получить оба идентификатора в том порядке, в котором они существуют для строки ввода.

1 Ответ

0 голосов
/ 18 мая 2018

BeautifulSoup сохраняет атрибуты тега в словаре .Поскольку в словаре не может быть дубликатов ключей, один атрибут id заменяет другой.Вы можете проверить словарь атрибутов, используя tag.attrs.

>>> soup = BeautifulSoup(tag, 'html.parser')
>>> soup.img.attrs
{'id': 'comp-jefxldtzbalatamediacontentimage', 'alt': '', 'data-type': 'image', 'src': 'http://webfast.co/images/webfast-logo.png'}

>>> soup = BeautifulSoup(tag, 'lxml')
>>> soup.img.attrs
{'id': 'webfast-uhyubv', 'alt': '', 'data-type': 'image', 'src': 'http://webfast.co/images/webfast-logo.png'}

. Как видите, мы получаем различное значение для id, используя разные парсеры.Это происходит, когда разные парсеры работают по-разному .

Невозможно получить оба значения id с помощью BeautifulSoup.Вы можете получить их, используя RegEx.Но, используйте его осторожно и в крайнем случае!

>>> import re
>>> tag = '<img id="webfast-uhyubv" alt="" data-type="image" id="comp-jefxldtzbalatamediacontentimage" src="http://webfast.co/images/webfast-logo.png" />'
>>> ids = re.findall('id="(.*?)"', tag)
>>> ids
['webfast-uhyubv', 'comp-jefxldtzbalatamediacontentimage']
...