Получить содержимое по именам классов, используя красивый суп
Используя модуль Beautiful Soup, как я могу получить данные тега div
, имя класса которого feeditemcontent cxfeeditemcontent
? Разве это:
soup.class['feeditemcontent cxfeeditemcontent']
Или:
soup.find_all('class')
Это HTML-источник:
<div class="feeditemcontent cxfeeditemcontent">
<div class="feeditembodyandfooter">
<div class="feeditembody">
<span>The actual data is some where here</span>
</div>
</div>
</div>
И это код Python:
from BeautifulSoup import BeautifulSoup
html_doc = open('home.jsp.html', 'r')
soup = BeautifulSoup(html_doc)
class="feeditemcontent cxfeeditemcontent"
6 ответов:
Попробуйте это, может быть, это слишком много для этой простой вещи, но это работает:
def match_class(target): target = target.split() def do_match(tag): try: classes = dict(tag.attrs)["class"] except KeyError: classes = "" classes = classes.split() return all(c in classes for c in target) return do_match html = """<div class="feeditemcontent cxfeeditemcontent"> <div class="feeditembodyandfooter"> <div class="feeditembody"> <span>The actual data is some where here</span> </div> </div> </div>""" from BeautifulSoup import BeautifulSoup soup = BeautifulSoup(html) matches = soup.findAll(match_class("feeditemcontent cxfeeditemcontent")) for m in matches: print m print "-"*10 matches = soup.findAll(match_class("feeditembody")) for m in matches: print m print "-"*10
Beautiful Soup 4 трактует значение атрибута "class" как список, а не строку, что означает, что решение jadkik94 может быть упрощено:
from bs4 import BeautifulSoup def match_class(target): def do_match(tag): classes = tag.get('class', []) return all(c in classes for c in target) return do_match soup = BeautifulSoup(html) print soup.find_all(match_class(["feeditemcontent", "cxfeeditemcontent"]))
soup.findAll("div", class_="feeditemcontent cxfeeditemcontent")
Итак, если я хочу получить все теги div заголовка класса
<div class="header">
из stackoverflow.com, пример с BeautifulSoup был бы чем-то вроде:from bs4 import BeautifulSoup as bs import requests url = "http://stackoverflow.com/" html = requests.get(url).text soup = bs(html) tags = soup.findAll("div", class_="header")
from BeautifulSoup import BeautifulSoup f = open('a.htm') soup = BeautifulSoup(f) list = soup.findAll('div', attrs={'id':'abc def'}) print list
Проверьте этот отчет об ошибке: https://bugs.launchpad.net/beautifulsoup / + ошибка/410304
Как видите, красивый суп нельзя по-настоящему пониматьclass="a b"
как два классаa
иb
. Однако, как видно из первого комментария, простого регулярного выражения должно быть достаточно. В вашем случае:Примечание: это было исправлено в недавней бета-версии. Я не просматривал документы последних версий, может быть, вы могли бы это сделать. Или если вы хотите заставить его работать, используя более старая версия, вы могли бы использовать выше.soup = BeautifulSoup(html_doc) for x in soup.findAll("div",{"class":re.compile(r"\bfeeditemcontent\b")}): print "result: ",x