Найти все элементы с учетом атрибута имен

Если у меня есть что-то вроде этого:

<p>blah</p> <p foo:bar="something">blah</p> <p foo:xxx="something">blah</p> 

Как мне получить beautifulsoup для выбора элементов с атрибутом пространства имен foo?

Например, я бы хотел вернуть 2-й и 3-й элементы.

2 Solutions collect form web for “Найти все элементы с учетом атрибута имен”

Из документации :

Beautiful Soup предоставляет специальный аргумент, называемый attrs, который вы можете использовать в этих ситуациях. attrs – словарь, который действует точно так же, как и аргументы ключевого слова:

 soup.findAll(id=re.compile("para$")) # [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>, # <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>] soup.findAll(attrs={'id' : re.compile("para$")}) # [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>, # <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>] 

Вы можете использовать attrs, если вам нужно наложить ограничения на атрибуты, имена которых являются зарезервированными словами Python, такими как класс, для или импорт; или атрибуты, имена которых не являются ключевыми аргументами для методов поиска Beautiful Soup: имя, рекурсивный, лимит, текст или attrs.

 from BeautifulSoup import BeautifulStoneSoup xml = '<person name="Bob"><parent rel="mother" name="Alice">' xmlSoup = BeautifulStoneSoup(xml) xmlSoup.findAll(name="Alice") # [] xmlSoup.findAll(attrs={"name" : "Alice"}) # [parent rel="mother" name="Alice"></parent>] 

Итак, для вашего примера:

 soup.findAll(attrs={ "foo" : re.compile(".*") }) # or soup.findAll(attrs={ re.compile("foo:.*") : re.compile(".*") }) 

BeautifulSoup (обе версии 3 и 4), похоже, не обрабатывает префикс namespace как что-то особенное. Он просто рассматривает атрибут namespace-prefix и namespaced как атрибут, который имеет двоеточие в его имени.

Таким образом, чтобы найти элементы <p> с атрибутами в пространстве имен foo , вам просто нужно attr.startswith('foo') все ключи атрибутов и проверить, не attr.startswith('foo') :

 import BeautifulSoup as bs content = '''\ <p>blah</p> <p foo:bar="something">blah</p> <p foo:xxx="something">blah</p>''' soup = bs.BeautifulSoup(content) for p in soup.find_all('p'): for attr in p.attrs.keys(): if attr.startswith('foo'): print(p) break 

доходность

 <p foo:bar="something">blah</p> <p foo:xxx="something">blah</p> 

С помощью lxml вы можете искать XPath, у которого есть поддержка синтаксиса для поиска атрибутов по пространству имен:

 import lxml.etree as ET content = '''\ <root xmlns:foo="bar"> <p>blah</p> <p foo:bar="something">blah</p> <p foo:xxx="something">blah</p></root>''' root = ET.XML(content) for p in root.xpath('p[@foo:*]', namespaces={'foo':'bar'}): print(ET.tostring(p)) 

доходность

 <p xmlns:foo="bar" foo:bar="something">blah</p> <p xmlns:foo="bar" foo:xxx="something">blah</p> 
  • Python xml.etree getiterator эквивалентен C #
  • Как удалить узел в xml с помощью ElementTree в Python?
  • Как удалить Create and Edit ... из поля many2one.?
  • Довольно печатать XML в Python
  • Поддержка Python ElementTree для синтаксического анализа неизвестных объектов XML?
  • Измените XML с помощью ElementTree
  • Ярлык не отображается в Odoo-9
  • Есть ли элегантный способ подсчета элементов тега в XML-файле с использованием lxml в python?
  • Python - лучший язык программирования в мире.