<br> 标签使用 scrapy 和 python 搞砸了我的数据

Posted

技术标签:

【中文标题】<br> 标签使用 scrapy 和 python 搞砸了我的数据【英文标题】:<br> tags screws up my data using scrapy and python 【发布时间】:2018-04-04 01:33:26 【问题描述】:

我正在尝试使用 scrapy 抓取亚马逊上的评论文本。问题是当评论包含多个输入时,span 元素中的文本由 标签分隔。所以,当我想抓取第一个评论时,我会使用这行代码:

response.css('span.a-size-base.review-text::text').extract_first()

这并没有给我评论的所有文本,而只是 元素和第一个 元素之间的文本。

我知道当我用“extract()”替换“extract_first()”时,我会得到所有的文本。但是,这也给了我其他评论的文本。

基本上,extract() 方法返回一个数组,其中的元素由 标签分隔。我需要用 标签分隔它。

有没有办法刮掉打开的元素和关闭的元素之间的所有文本?

HTML 代码示例:

< span data-hook="review-body" class="a-size-base review-text">
    "I like this product, the reasons why are explained below"
    < br >
    < br >
    "1. It looks nice" 
    < br >
    "2. I love it"
< /span >

网站上的样子:

我喜欢这个产品,原因在下面解释

    看起来不错 我喜欢它

我将使用 extract_first() 得到的输出:

“我喜欢这个产品,原因在下面解释”

我将使用 extract() 得到输出(注意它由三个元素组成):

"我喜欢这个产品,原因在下面解释", "1. 看起来不错", “2. 我喜欢它”

我想得到的输出(只有一个元素,评论本身):

“我喜欢这个产品,原因解释如下 1. 很好看 2. 我喜欢”

【问题讨论】:

【参考方案1】:

使用 extract() 并加入列表。

>>> text=["I like this product, the reasons why are explained below", "1. It looks nice", "2. I love it"]
>>> " ".join(text)
'I like this product, the reasons why are explained below 1. It looks nice 2. I love it'

【讨论】:

我以一篇评论为例。如果页面上有更多评论,extract() 的输出将包含更多评论。因此,如果我使用 join(text),我会将所有评论的文本合并到一个元素中。 还有问题吗? 是的,也许我的问题不清楚。但是当页面上有例如 2 条评论时,我将使用 join(text)。我会将 2 条评论放在一起,但我想将它们分开。 如果返回的列表包含两条评论,其中前两个元素是第一个评论的文本,其他三个元素是第二个评论的文本。我想要一个包含 2 个元素的列表,其中第一个元素是第一个评论,第二个元素是第二个评论。我知道您可以手动执行此操作,但如果事先不知道审阅者在其审阅中输入了多少,这是行不通的。

以上是关于<br> 标签使用 scrapy 和 python 搞砸了我的数据的主要内容,如果未能解决你的问题,请参考以下文章

怎样用js去掉br标签

使用 Google App Engine 和 Jinja2 允许 <br> 标签

使用 Google App Engine 和 Jinja2 允许 <br> 标签

用 <p> 段落和 <br /> 标签替换换行符

使用 Scrapy 从 HTML 中的 <script> 标签获取数据

.innerhtml 将 <br/> 标签转换为 <br>