ซุปที่สวยงามและแยก div และเนื้อหาตาม ID


147
soup.find("tagName", { "id" : "articlebody" })

เหตุใดจึงไม่ส่งคืน<div id="articlebody"> ... </div>แท็กและสิ่งต่าง ๆ ในระหว่างนั้น มันไม่ส่งคืนอะไรเลย และฉันก็รู้ว่ามันมีอยู่จริงเพราะฉันกำลังจ้องมองมัน

soup.prettify()

soup.find("div", { "id" : "articlebody" }) ยังไม่ทำงาน

( แก้ไข:ฉันพบว่า BeautifulSoup ไม่ได้แยกวิเคราะห์หน้าของฉันอย่างถูกต้องซึ่งอาจหมายถึงหน้าที่ฉันพยายามแยกวิเคราะห์ไม่ได้จัดรูปแบบที่เหมาะสมใน SGML หรืออะไรก็ตาม)


(ในการแก้ไขของคุณคำถามนี้ยังคงมีค่าเป็นทรัพยากรที่นำมาใช้ซ้ำกับคนอื่น ๆ แม้ว่า parser ไม่ทำงานในหน้าหนึ่งของคุณ)
smci

คำตอบ:


202

คุณควรโพสต์เอกสารตัวอย่างของคุณเนื่องจากรหัสทำงานได้ดี:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

หา<div>s ภายใน<div>ผลงานเช่นกัน:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

2
เอกสารตัวอย่างของฉันมีขนาดใหญ่มาก ฉันกำลังติดตามปัญหา - ฉันคิดว่าวิธีนี้ใช้ไม่ได้กับ div ของ divs ฉันนับจำนวนของ div ที่อยู่ในเอกสารที่มีพิมพ์ len (soup ('div')) ซึ่งมีผลเป็น 10 และฉันสามารถเห็นอย่างชัดเจนมากกว่า 10 divs ด้วย firebug ดังนั้นฉันคิดว่ามันไม่สามารถหา div ใน divs ได้ดังนั้นฉันต้อง จำกัด สิ่งต่าง ๆ ให้แคบลงด้วย wrapper
Tony Stark

8
ถ้าอย่างนั้นมันเป็นไปไม่ได้ที่จะตอบคำถามของคุณลูกบอลคริสตัลไม่ใช่วิธีที่น่าเชื่อถือในการดีบั๊ก :)
LukášLalinský

1
ฉันลองรหัสนี้ div มี <embed> และฉันไม่สามารถพิมพ์ฝังไว้ข้างในได้
วินเซนต์

13
หรือมากกว่านั้นง่ายๆdiv = soup.find(id="articlebody")
jfs

4
หรือsoup.find('div', id='articlebody')
เทรเวอร์บอยด์สมิ ธ

71

ในการค้นหาองค์ประกอบตามองค์ประกอบid:

div = soup.find(id="articlebody")

15

Beautiful Soup 4 รองรับCSS selectorส่วนใหญ่ด้วย.select()วิธีการดังนั้นคุณสามารถใช้idตัวเลือกเช่น:

soup.select('#articlebody')

หากคุณต้องการระบุประเภทขององค์ประกอบคุณสามารถเพิ่มตัวเลือกประเภทก่อนidตัวเลือก:

soup.select('div#articlebody')

.select()วิธีการจะกลับมาคอลเลกชันขององค์ประกอบซึ่งหมายความว่ามันจะกลับมาผลเช่นเดียวกับต่อไปนี้.find_all()วิธีการเช่น:

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

หากคุณต้องการเลือกองค์ประกอบเดียวคุณก็สามารถใช้.find()วิธีนี้ได้ :

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")

13

ฉันคิดว่ามีปัญหาเมื่อแท็ก 'div' ซ้อนกันมากเกินไป ฉันพยายามแยกผู้ติดต่อจากไฟล์ facebook html และ Beautifulsoup ไม่สามารถค้นหาแท็ก "div" กับคลาส "fcontent"

สิ่งนี้เกิดขึ้นกับชั้นเรียนอื่นเช่นกัน เมื่อฉันค้นหา div โดยทั่วไปมันจะเปลี่ยนเฉพาะไฟล์ที่ไม่ซ้อนกันมาก

ซอร์สโค้ด html สามารถเป็นหน้าใดก็ได้จาก facebook ของรายชื่อเพื่อนของเพื่อนของคุณ (ไม่ใช่หนึ่งในเพื่อนของคุณ) หากใครบางคนสามารถทดสอบและให้คำแนะนำฉันจะขอบคุณมันจริงๆ

นี่คือรหัสของฉันที่ฉันพยายามพิมพ์จำนวนแท็ก "div" ด้วย class "fcontent":

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)

9

ส่วนใหญ่อาจเป็นเพราะ parser beautifulsoup เริ่มต้นมีปัญหา เปลี่ยนโปรแกรมวิเคราะห์คำอื่นเช่น 'lxml' แล้วลองอีกครั้ง


มันใช้งานได้สำหรับฉันขอบคุณ! ฉันใช้soup = BeautifulSoup(data, parser="html.parser")
จะฮาร์ต

8

ในแหล่งที่มาที่สวยงามบรรทัดนี้อนุญาตให้ div ซ้อนกันภายใน div; ดังนั้นความกังวลของคุณในความคิดเห็นของ Lukas จะไม่ถูกต้อง

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

สิ่งที่ฉันคิดว่าคุณต้องทำคือระบุพนักงานที่คุณต้องการเช่น

source.find('div', attrs={'id':'articlebody'})

5

คุณเคยลองsoup.findAll("div", {"id": "articlebody"})ไหม

ฟังดูบ้า แต่ถ้าคุณกำลังคัดสิ่งจากป่าคุณไม่สามารถแยกออกเป็นหลาย divs ...


4

ฉันใช้:

soup.findAll('tag', attrs={'attrname':"attrvalue"})

เป็นไวยากรณ์ของฉันสำหรับ find / findall; ที่กล่าวว่าหากไม่มีพารามิเตอร์ทางเลือกอื่น ๆ ระหว่างแท็กและรายการแอตทริบิวต์สิ่งนี้ไม่ควรแตกต่างกัน


4

เกิดขึ้นกับฉันในขณะที่พยายามขูด Google
ฉันลงเอยด้วยการใช้ pyquery
ติดตั้ง:

pip install pyquery

ใช้:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')

3

นี่คือส่วนของรหัส

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

อย่างที่คุณเห็นฉันพบแท็กทั้งหมดแล้วฉันจะหาแท็กทั้งหมดที่มี class = "บทความ" ข้างใน


0

มีการระบุIdคุณสมบัติเฉพาะเสมอ นั่นหมายความว่าคุณสามารถใช้งานได้โดยตรงโดยไม่ต้องระบุองค์ประกอบ ดังนั้นจึงเป็นข้อดีหากองค์ประกอบของคุณมีการแยกวิเคราะห์เนื้อหา

divEle = soup.find(id = "articlebody")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.