【问题标题】:No text printed when using response.xpath() or response.css in scrapy在 scrapy 中使用 response.xpath() 或 response.css 时不打印文本
【发布时间】:2020-07-22 04:59:05
【问题描述】:

当我使用scrapy时,我正在尝试从网站中提取文本

        print("hello")
        data = response.xpath('//div[@class="content-blog"]/text()').get()
        print(data)

输出是

hello


删除 /text() 会将整个 HTML 内容作为输出。

<div class="content-blog">
                                                       <p><strong><i>Title</i></strong><br>
Text paragraph1</p>
<p>Text paragraph2</p>
<p>Text paragraph3<br>
Text paragraph4</p>
<style id="bwg-style-0">    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 {      width: 1004px;      justify-content: center;              margin-left: auto;        margin-right: aut
o;              background-color: rgba(255, 255, 255, 0.00);            padding-left: 4px;      padding-top: 4px;      max-width: 100%;            }        #bwg_container1_0 #bwg_container2
_0 .bwg-container-0 .bwg-item {      justify-content: flex-start;      max-width: 200px;          }    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-item > a {       margin-righ
t: 4px;       margin-bottom: 4px;    }    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-item0 {      padding: 0px;      background-color: #FFFFFF;      border: 0px none #CCCCCC;
      opacity: 1.00;      filter: Alpha(opacity=100);      border-radius: 0;      box-shadow: 0px 0px 0px #888888;    }    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-item1 im
g {      max-height: none;      max-width: none;      padding: 0 !important;    }        @media only screen and (min-width: 480px) {      #bwg_container1_0 #bwg_container2_0 .bwg-container-
0 .bwg-item0 {        transition: all 0.3s ease 0s;-webkit-transition: all 0.3s ease 0s;      }      #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-item0:hover {        -ms-trans
form: scale(1.1);        -webkit-transform: scale(1.1);        transform: scale(1.1);      }    }          #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-item1 {      padding-top
: 90%;    }        #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-title2,    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-ecommerce2 {      color: #CCCCCC;      font
-family: segoe ui;      font-size: 16px;      font-weight: bold;      padding: 2px;      text-shadow: 0px 0px 0px #888888;      max-height: 100%;    }    #bwg_container1_0 #bwg_container2_0
 .bwg-container-0 .bwg-play-icon2 {      font-size: 32px;    }    #bwg_container1_0 #bwg_container2_0 .bwg-container-0 .bwg-ecommerce2 {      font-size: 19.2px;      color: #CCCCCC;    }
 </style>    <div id="bwg_container1_0" class="bwg_container bwg_thumbnail bwg_thumbnails" data-right-click-protection="0" data-bwg="0" data-lightbox-url=.... </div>

当我使用 response.css() 时也会发生同样的事情。

我要提取的文本位于多个 &lt;p&gt; 标记中,这些标记位于 &lt;div class="content-blog"&gt; 标记下。

如何仅从网站获取文本而不获取 HTML 的其余部分? 我正在使用 scrapy 版本 - 2.2.0 和 Python 版本 - 3.7

【问题讨论】:

  • 您能给我们提供一个 URL 和您需要的确切数据吗?您选择的 xpath 选择器只会获取 div 标签元素本身内的文本,而不是像

    .

    这样的子标签

标签: scrapy


【解决方案1】:

由于没有提供太多信息来获取段落文本

data = response.xpath('//div[@class="content-blog"]/p/text()').getall()

这将从 div 标签中获取所有 p 标签的子标签。请注意,变量数据将是一个列表。 getall() 方法获取 XPATH 选择器中指定的所有标签。

【讨论】:

  • 这给了我所需的文本。我想我将能够处理列表中的数据。谢谢。
  • 你能把答案打勾作为接受吗?我的答案左侧的勾号。谢谢。很高兴我能帮上忙!
  • 我在一些我试图抓取的网站上尝试了这个解决方案,到目前为止,当 HTML 的结构类似于 &lt;div class = "content-blog"&gt; &lt;p&gt; &lt;/p&gt;&lt;/div&gt; 时它工作正常,但我也有一些结构类似的网站&lt;div class = 'content-blog'&gt;&lt;div class = "col-sm-6"&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt; 这不适用于这些网站。是否有适用于这两种情况的通用解决方案?
  • 我认为值得尝试学习一下 XPATH 选择器,因为这将使您在自己回答这些类型的问题时更加灵活。我们应该查看包含文本的标签元素。如果有一个类属性,您可以直接使用 XPATH 指定它。所以在这种情况下 '//div[@class="col-sm-6"]/p/text()' 是 XPATH 选择器。您可以选择任何标签并在必要时使用“/”继续沿链向下移动,但如果标签具有更具体的类属性并且 XPATH 选择器文本更短,在代码中总是更具可读性。
  • 我一定会读到 XPATH 选择器。没看懂最后一句是什么意思,能解释一下吗?
【解决方案2】:

你也可以试试 CSS。因为,CSS 很容易编写,并且 CSS 在底层也可以转换为 XPATH。

data = response.css('.content-blog ::text').getall()

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2018-12-05
    • 2019-12-31
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多