Как игнорировать атрибуты без значения и игнорировать теги с определенным классом с BeautifulSoup - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь распечатать только значение upc всех разделов внутри раздела класса results, которые имеют значение атрибута upc и также не содержат класс EAN.

<div class="results">
  <div upc="1284665">This one</div>
  <div upc="8432651">This one</div>
  <div upc>Not this one</div>
  <div upc="1384268" class="EAN">Not this one too</div>
</div>

Требуемый вывод:

1284665
8432651

Это код, который у меня есть сейчас, но он включает в себя все разделы внутри раздела results class.

html = '''<div class="results">
  <div upc="1284665">This one</div>
  <div upc="8432651">This one</div>
  <div upc>Not this one</div>
  <div upc="1384268" class="EAN">Not this one too</div>
</div>'''

soup = BeautifulSoup(html, 'lxml')

for section in soup.select_one('.results'):
    print(section)

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Это с помощью BeautifulSoup 4.7+. С CSS-селекторами это довольно просто:

from bs4 import BeautifulSoup

html = """
<div class="results">
  <div upc="1284665">This one</div>
  <div upc="8432651">This one</div>
  <div upc>Not this one</div>
  <div upc="1384268" class="EAN">Not this one too</div>
</div>
"""

soup = BeautifulSoup(html, 'lxml')

for section in soup.select('.results div[upc]:not([upc=""], .EAN)'):
    print(section['upc'])

Вывод

1284665
8432651
1 голос
/ 30 октября 2019

Если вы знакомы с xpaths и навигацией по деревьям, вы можете попробовать использовать lxml.

import lxml
from lxml import html

html_content = '''<div class="results">
  <div upc="1284665">This one</div>
  <div upc="8432651">This one</div>
  <div upc>Not this one</div>
  <div upc="1384268" class="EAN">Not this one too</div>
</div>'''
tree = html.fromstring(html_content)
Items = tree.xpath("//div/div[not(contains(@class,'EAN'))]") 


for item in Items:
    if(item.attrib['upc']!=None):
        print(item.attrib['upc'])
1 голос
/ 30 октября 2019

Вы можете использовать это:

for div in soup.find_all("div"):
    if div.get("upc") and "EAN" not in div.get("class", default=[]):
        print(div.get("upc"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...