我正在嘗試使用 Scrapy 抓取一些論壇帖子的內容,并且我想排除從以前的帖子中參考的文本。我很幸運,該網站非常清楚地標記了這個參考文本(它在“blockquote”標簽內),但我不知道如何獲取所有不在blockquote 標簽中的文本。下面是論壇帖子結構的示例。在這個特定的帖子中,用戶寫了一些東西,然后參考上一篇文章,然后再寫一些。所以基本上,我想擺脫的標簽夾在我想要的內容之間。更常見的是,參考的文本會在前面,然后是新的文本,但我也需要能夠處理這樣的奇怪情況。
我嘗試使用 w3lib remove_tags:
from w3lib.html import remove_tags, remove_tags_with_content
body = post.css('div.bbWrapper')[0]
content = remove_tags(remove_tags_with_content(body, ('blockquote', )))
但我收到一個錯誤:TypeError: to_unicode must receive a bytes, str or unicode object, got Selector
我找到了有關如何使用 Beautiful Soup 執行此操作的說明,但未找到 Scrapy。如果使用 BS 是唯一的選擇,我可以在 Scrapy 決議專案方法的中間切換到它嗎?
<article ...>
<div class="bbWrapper">TEXT I WANT TO COLLECT HERE<br>
<blockquote ...>
<div class="bbCodeBlock-title">
<a href="/forums/goto/post?id=1053788123" ...">OTHER GUY SAID:</a>
</div>
<div hljs-string">">
<div hljs-string">">
<b>TEXT I DON'T WANT<br>
<br>
TEXT I DON'T WANT</b>
</div>
<div hljs-string">"><a role="button" tabindex="0">TEXT I DON'T WANT</a></div>
</div>
</blockquote>
TEXT I WANT</div>
<div hljs-string">"> </div>
<div style="margin:10px 0 10px 0;">
...
</div>
</article>
uj5u.com熱心網友回復:
@larapsodia,請瀏覽這里。它可能會幫助您解決問題。
uj5u.com熱心網友回復:
首先,在你給出的例子中,如果我只選擇 div 中的文本,我得到:
In [1]: response.xpath('.//div/text()').getall()
Out[1]:
['TEXT I WANT TO COLLECT HERE',
'\r\n',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\nTEXT I WANT',
'\xa0',
'\r\n...\r\n']
所以你可以做這樣的事情:
In [2]: [x.strip() for x in response.xpath('.//div/text()').getall() if x.strip()]
Out[2]: ['TEXT I WANT TO COLLECT HERE', 'TEXT I WANT', '...']
或者最好不要選擇它(搜索所有沒有 div 祖先或 self 的 div 標簽):
In [3]: response.xpath('//div//text()[not(ancestor-or-self::div[contains(@class,"bbCodeBlock")])]').getall()
Out[3]:
['TEXT I WANT TO COLLECT HERE',
'\r\n',
'\r\n ',
'\r\n ',
'\r\n ',
'\r\nTEXT I WANT',
'\xa0',
'\r\n...\r\n']
而且您已經知道如何處理串列。
uj5u.com熱心網友回復:
@Fazlul 鏈接的帖子很有幫助,盡管它缺少我需要的步驟。對于未來有這個問題的人:
絆倒我的事情是我無法從 Scrapy Selector 物件中洗掉 html 元素。但我只需要在選擇器上使用 extract() 來獲取一個字串,然后它就起作用了。
from w3lib.html import remove_tags, remove_tags_with_content
posts = response.css('div.contentRow-main')
for post in posts:
body = post.css('div.bbWrapper')[0]
content = remove_tags(remove_tags_with_content(body.extract(), ('blockquote', )))
item['content'] = content
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/353651.html
