-
22-09-2019 - |
سؤال
أحاول تجميع مكشطة HTML أساسية لمجموعة متنوعة من مواقع المجلات العلمية ، وتحاول على وجه التحديد الحصول على الفقرة المجردة أو التمهيدية.
المجلة الحالية التي أعمل عليها هي الطبيعة ، والمقال الذي كنت أستخدمه حيث يمكن رؤية عينة بلدي في http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html.
لا يمكنني الحصول على الملخص من تلك الصفحة. أنا أبحث عن كل شيء بين <p class="lead">...</p>
العلامات ، لكن لا يمكنني معرفة كيفية عزلها. اعتقدت أنه سيكون شيئًا بسيطًا مثل
from BeautifulSoup import BeautifulSoup
import re
import urllib2
address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)
abstract = soup.find('p', attrs={'class' : 'lead'})
print abstract
باستخدام Python 2.5 ، BeautifulSoup 3.0.8 ، يدير هذا "لا شيء". ليس لدي أي خيار لاستخدام أي شيء آخر يحتاج إلى تجميعه/تثبيته (مثل LXML). هل جميلة في الخلط أم أنا؟
المحلول
أن HTML مشوه إلى حد كبير ، و xml.dom.minidom لا يمكن تحليله ، والتحليل الجميل لا يعمل بشكل جيد.
أزلت بعض <!-- ... -->
قطع الغيار والحالة مرة أخرى مع BeautifulSoup ، ثم يبدو أفضل وقادرة على الجري soup.find('p', attrs={'class' : 'lead'})
هذا هو الرمز الذي جربته
>>> html =re.sub(re.compile("<!--.*?-->",re.DOTALL),"",html)
>>>
>>> soup=BeautifulSoup(html)
>>>
>>> soup.find('p', attrs={'class' : 'lead'})
<p class="lead">The class of exotic Jupiter-mass planets that orb .....
نصائح أخرى
إليك طريقة غير BS للحصول على الملخص.
address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
for para in html.split("</p>"):
if '<p class="lead">' in para:
abstract=para.split('<p class="lead">')[1:][0]
print ' '.join(abstract.split("\n"))