2012-07-04 30 views
9

Sử dụng mô-đun Súp tuyệt đẹp, làm cách nào để lấy dữ liệu của thẻ div có tên lớp là feeditemcontent cxfeeditemcontent? Là nó:Lấy tên và nội dung của lớp bằng cách sử dụng Beautiful Soup

soup.class['feeditemcontent cxfeeditemcontent'] 

hay:

soup.find_all('class') 

Đây là nguồn HTML:

<div class="feeditemcontent cxfeeditemcontent"> 
    <div class="feeditembodyandfooter"> 
     <div class="feeditembody"> 
     <span>The actual data is some where here</span> 
     </div> 
    </div> 
</div> 

và đây là mã Python:

from BeautifulSoup import BeautifulSoup 
html_doc = open('home.jsp.html', 'r') 

soup = BeautifulSoup(html_doc) 
class="feeditemcontent cxfeeditemcontent" 

Trả lời

8

Hãy thử điều này, có lẽ nó quá nhiều cho điều đơn giản này nhưng nó hoạt động:

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 
+4

'classes = dict (tag.attrs) .get ('class', '')' ngắn hơn nhiều so với 'try'' except' block và chức năng của nó giống nhau. –

+0

@DoronCohen là 'dict()' cần thiết? Dường như làm việc mà không có. – Mark

+0

@Mark Tôi nhận được một ngoại lệ mà không có 'dict()' bởi vì nó là một danh sách 'TypeError: chỉ mục danh sách phải là số nguyên, không phải str'. Ngoài ra, câu trả lời này giả định Beautiful Soup 3 (có thể là lý do tại sao bạn nhìn thấy kết quả khác nhau), có lẽ bạn nên sử dụng phiên bản 4 và sử dụng câu trả lời khác. – jadkik94

1
soup.find("div", {"class" : "feeditemcontent cxfeeditemcontent"}) 
+0

hoặc soup.findTất cả nếu bạn muốn nhiều hơn một (sử dụng cùng một đối số) –

+0

Tôi sẽ không thực sự sử dụng mã đó vì lý do hiển nhiên. Kiểm tra câu trả lời của tôi. Có một báo cáo lỗi liên quan. – SuperSaiyan

+0

Bạn có thể giải thích tại sao bạn downvoted giải pháp của tôi? Nó hoạt động hoàn hảo. –

0

Kiểm tra báo cáo lỗi này: https://bugs.launchpad.net/beautifulsoup/+bug/410304

Như bạn có thể thấy, Súp đẹp có thể không thực sự hiểu class="a b" là hai lớp ab.

Tuy nhiên, như nó xuất hiện trong bình luận đầu tiên ở đó, một regexp đơn giản là đủ. Trong trường hợp của bạn:

soup = BeautifulSoup(html_doc) 
for x in soup.findAll("div",{"class":re.compile(r"\bfeeditemcontent\b")}): 
    print "result: ",x 

Lưu ý: Điều đó đã được sửa trong bản beta gần đây. Tôi đã không đi qua các tài liệu của các phiên bản gần đây, có thể bạn có thể làm điều đó. Hoặc nếu bạn muốn làm cho nó hoạt động bằng cách sử dụng phiên bản cũ hơn, bạn có thể sử dụng ở trên.

17

Beautiful Soup 4 xử lý giá trị của "lớp học" thuộc tính như một danh sách chứ không phải là một chuỗi, nghĩa là giải pháp jadkik94 của thể được đơn giản hóa:

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"])) 
3
from BeautifulSoup import BeautifulSoup 
f = open('a.htm') 
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'id':'abc def'}) 
print list 
4

soup.findAll("div", class_="feeditemcontent cxfeeditemcontent")

Vì vậy, Nếu tôi muốn ge t tất cả các thẻ div header lớp <div class="header"> từ stackoverflow.com, một ví dụ với BeautifulSoup sẽ là một cái gì đó như:

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") 

Nó đã nằm trong BS4 documentation.

Các vấn đề liên quan