在具有 <p> 和 <font> HTML 元素

问题描述 投票:0回答:2

背景

我一直在做这个小型网络抓取项目来练习和提高我的编码技能。我有一个想法,我可以保留祖父的一些作品并将其保存在某个地方,并在将来当网站上不再存在时保留他的遗产。所以我正在尽自己的一份力量,尽我所能并与我的家人分享。

我使用 Python 来完成这个项目,并使用 urllib,而不使用其他框架,如 BeautifulSoup 或 Selenium。我这样做的原因是总体上有一个强有力的编码原则,并慢慢建立最佳方法及其背后的原因。另外,我也想学习我的库,所以我相信这是一种很好的学习方式。最终(不过不是现在),我会在另一个项目中选择使用 BeautifulSoup。

问题

我有一个解析器,可以检查段落并将它们保存到列表中。因此,每当出现

<p>
</p>
时,我都会将信息放入我的列表中并继续。现在,我对它找到的每个标题都执行此操作,但我发现了特定类型文章的一个小错误。当文章与其他文章相比具有
<font>
</font>
时,它们的结构不同。我正在尝试检查字体标签,但似乎它没有完成应有的工作。对于这一切,我确实检查元素到任何 div 所在的位置,然后从中进行解析。

示例

这是我最初的URL,我从它所在的div(

div class="item-article-body size-20"
)开始解析,然后从那里开始。

<div class="item-article-body size-20">
<div class="author-image">
<a href="https://alrai.com/author/19/د-زيد-حمزة">
<img src="https://alrai.com/uploads/authors/19_1635945465.jpg" width="100%" height="100%" alt="د. زيد حمزة">
</a>
</div>
<a href="د. زيد حمزة" class="author-name-a">د. زيد حمزة</a>
لم يكن ضروريا أن ينتظر الشعب البريطاني وغيره من شعوب العالم سبع سنوات حتى يطل عليها تقرير تشيلكوت ويدين توني بلير فالادانة الشعبية – ولو على نطاق محدود – كانت قائمة حتى قبل الحرب على العراق، ولم يكن ضروريا أن يقرأ الناس في كل مكان آلاف الصفحات كي يستوعبوا حجم الخديعة التي أجاد نسج خيوطها رئيس الوزراء البريطاني بالتواطؤ مع رئيس الولايات المتحدة لتبرير تلك الحرب التي اودت بحياة الآلاف من جنود بلديهما وبلغت تكاليفها ارقاما فلكية (اكثر من 3 تريليون دولار) ! كما لم يُرضِ احداً ان يسارع بلير في اليوم التالي لصدور التقرير بمواجهة الصحافة فيعترف بالخطأ لكنه يصر على أنه لولا غزو العراق لكان العالم الآن في حال أسوأ مع ان الواقع الماثل عكس ذلك تماما ومن مضاعفاته أن الارهاب الاعمى قد وصل الى الغرب نفسه ! لا بل إن بلير أهان الضمير العالمي حين لم يعترف بالذنب او يعتذر – مجرد اعتذار – عن التسبب في قتل وتشريد ملايين العراقيين وتدمير دولتهم وتمزيق بلدهم وإشعال فتنة طائفية فيها لا يعلم احد متى تنطفئ نارها.<br><br>صحيح أن لغة التقرير ليست جازمة في تبيان الأدلة على دخول حرب فتاكة بمبررات غير صحيحة على الاطلاق، فلا العراق كان يملك أسلحة دمار شامل ولا صدام كانت له علاقة بالقاعدة أو بن لادن، لذلك لم نجد وزارة العدل البريطانية تتحرك لاقامة الدعوى ضد توني بلير لمحاكمته امام القضاء البريطاني ولم تتحرك حكومة العراق (!) كي تأخذه الى محكمة العدل الدولية أو محكمة الجنايات الدولية كما وقفت مكتوفة اليدين منظمات حقوق الانسان ( أمنستي انترناشونال وهيومان رايتس ووتش على سبيل المثال ) وكذلك المفوضية الدولية لحقوق الانسان في الأمم المتحدة ! أما الديمقراطية البريطانية ، وهي أم الديمقراطيات كما يقال، فسوف يخجل برلمانها من عدم قدرته استنادا الى هذا التقرير على محاسبة توني بلير وتحميله مسؤولية الارواح ( ارواح الجنود البريطانيين على الأقل ) التي ازهقت عبثا وبهتانا رغم نصيحة المخابرات البريطانية بأن غزو العراق سوف لن يقضي على الارهاب بل يؤدي الى مزيد منه ورغم تقرير المخابرات الاميركية بناء على طلب من البنتاغون والذي أفاد ايضا بان الارهاب سوف يستشري ويتسع.. أما اللغة المائعة للتقرير - كما قالت كثير من الصحف العالمية – فربما كانت وراء تأخير صدوره كل هذه السنوات الطويلة ، في محاولة من قوى ضاغطة عديدة من اجل ان يأتي في صيغة تجعل رئيس الوزراء توني بلير قادراً على الافلات من العقاب وكذا الرئيس جورج دبليو بوش ونائبه ديك تشيني ووزير دفاعه دونالد رامسفيلد الذين استخدم بعض الكتاب في وصفهم نعوتاً جارحة وهم يتساءلون عن سبب حماسهم في شن الحرب على العراق الذي أنكر وجود اسلحة الدمار الشامل لديه في حين جبنوا كل الوقت عن التصدي لكوريا الشمالية التي تملك مثل هذه الاسلحة وتعلن عن وجودها في حوزتها ( حتى ان بعضهم ذكّر بباكستان! ) ، وقبل ذلك كله لم ينبسوا ببنت شفة وهم يعلمون علم اليقين بان اسرائيل تملك مائتي قنبلة ذرية على الاقل..! وقد سخر الكتاب كذلك من ادعاءات اولئك الزعماء الغربين بان الحرب كانت من اجل التخلص من دكتاتورية صدام وتوفير الديمقراطية للشعب العراقي فالعالم كله يعرف أن اكثر حلفائهم في المنطقة العربية لا يحكمون بالديمقراطية ! وأثبت بعض الكتاب ان هدف الحرب تدمير كيانات عديدة في المنطقة خدمة للحليفة الاستراتيجية اسرائيل وكان من نتائجها الكارثية ايضاً اقتتال طائفي وارهاب لم يعرف العالم مثيلاً لفظاعته..<br><br>وبعد.. فما لم تشر له معظم التعليقات هو أن المستفيد الأكبر من شن الحرب كان المجمع العسكري الصناعي من خلال البنتاغون وال <span dir="LTR">FED</span> وصفقات الأسلحة.. بالمليارات يومياً !<br><br>****<br><br>تنويه: أخطأتُ في مقال الاسبوع الماضي بان ذكرت أن المعابد البوذية تدعى بادوغا <span dir="LTR">Padoga</span> والصحيح أنها باغودا <span dir="LTR">Pagoda</span> ولقد لفت نظري لذلك الصديق حسان بدران (رفيق الرحلة الى بورما وفيتنام) وإذ أشكره فاني اعتذر للقراء وأعفي (الرأي) من مسؤوليتها عن هذا الخطأً..<br><br>
</div>

代码

import urllib.parse

def paragraphs(url):
#Note: if I want to look for paragraphs HTML elements, I would change it to <p> and </p> instead of font (that part works). Only issue is when it comes to the font and how the HTML is structured.

content = html_content(url)
paragraphs = []
target_element_paragraph_article = '<div class="item-article-body size-20">'
start_index = content.find(target_element_paragraph_article)

if start_index != -1:
    start_index += len(target_element_paragraph_article)
    content_paragraph = content[start_index:].strip()
    paragraph_start = content_paragraph.find('<font>')

    while paragraph_start != -1:
        paragraph_end = content_paragraph.find('<font>', paragraph_start)

        if paragraph_end != -1:
            paragraph = content_paragraph[paragraph_start + len('<p>'):paragraph_end].strip()
            paragraphs.append(paragraph)
            paragraph_start = paragraph_end + len('</font>')
        else:
            print("Closing </font> tag not found")
            break
else:
    print("Font element was not found")

return paragraphs

如果有任何问题,请告诉我。我很高兴回复他们:)

python html web-scraping urllib
2个回答
1
投票

听起来您无法使用代码抓取文章的段落

如果我理解有误,请告诉我

def remove_html_tags(text):
    clean = re.compile('<.*?>')
    return re.sub(clean, '', text)

paragraphs = []
start_tag = '<div class="item-article-body size-20">'
end_tag = '</div>\n</div>\n</div>'
start_index = content.find(start_tag)
end_index = content.find(end_tag, start_index)

if start_index != -1 and end_index != -1:
    extracted_text = content[start_index + len(start_tag):end_index]
    temp = extracted_text.split('<br><br>')
    for i,data in enumerate(temp):
        temp[i] = remove_html_tags(data).strip()
        if not temp[i]:
            temp.remove(temp[i])
    print(temp)
else:
    print("article not found ")

0
投票

正如@Sepu Ling 指出的那样,它成功了。最后的结果还是很不错的。这就是我所做的,没有逐一列举:

def paragraphs(url):
'''Return the paragraph list of the specified URL'''

content = html_content(url)
paragraphs = []
start_tag = '<div class="item-article-body size-20">'
end_tag = '</div>\n</div>\n</div>'
start_index = content.find(start_tag)
end_index = content.find(end_tag, start_index)

if start_index != -1 and end_index != -1:
    extracted_text = content[start_index + len(start_tag):end_index]
    temp = extracted_text.split('<br>')
    for data in temp:
        paragraph = remove_html_tags(data).strip()
        if paragraph:
            paragraphs.append(paragraph)
    return paragraphs
else:
    print("Article not found ")
    return []

def remove_html_tags(text):
    clean = re.compile('<.*?>')
    return re.sub(clean, '', text)

我删除了额外的

br
标签,因为我想保留这些段落。如果我希望每个段落都是一个,我会在其中添加额外的 br 标签。

© www.soinside.com 2019 - 2024. All rights reserved.