scrapy 访问html中的li和ul元素

cig3rfwq  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(206)

我想从下面的结构的html中提取文本。

selector = scrapy.Selector(text="""
<li>Text1
  <ul>
    <li>Text2</li>
    <li>Text3</li>
  </ul>
</li>
""")

下面的选项给予我所有的文本,包括新行,但失去了所有的html结构。

selector.xpath('/descendant-or-self::*/text()').extract() 
selector.xpath('//li/text()').extract()

有没有一种方法可以通过某种路径访问这些元素呢?我希望能够通过类似下面的方法选择第一个文本(Text1),

selector.xpath('//li/text()').extract()

因为其余的(文本2和文本3)可以通过,

selector.xpath('//li/ul/li/text()').extract()
chhqkbe1

chhqkbe11#

由于您的预期输出是什么并不清楚,因此假设您希望从顶部li标签和ul/li标签中提取字符串/文本节点。
下面的xpath表达式将从顶部li标记中选择文本

el =''.join(selector.xpath('//*[@class="a"]/ancestor::li/text()').extract()).replace('\n','').strip()
txt = re.sub(r'\s+',' ',el)

sel =' '.join(selector.xpath('//*[@class="a"]/ancestor::ul//li//text()').extract()).replace('\n','').strip()

txt2 = re.sub(r'\s+',' ',sel)

上面的路径表达式将从ul/li标记中选择文本
P/S:我使用re模块仅用于删除多余白色

由Scrapy Shell证明

%paste
selector = scrapy.Selector(text="""

<li>Text1
  <ul>
    <li>Text2</li>
    <li>Text3</li>
    <li><class="a">
      <i>Text4</i>
        Text5 
        <cite style="Style2" class="a">
        <a href="href1" title="Title1"> Text6</a>.
      </cite>
      <span class="b" title="Title2">
        <span style="Style1"></span>
      </span>
    </li>
    <li>
      Text7 
      <cite style="Style2" class="a">
        <i>Text8</i>
        Text9
        <a href="href2" title="Title2">Text10</a>.
      </cite>
      <span class="b" title="Title3">
        <span style="Style3"></span>
      </span>
    </li>
  </ul>
</li>
""")

    el =''.join(selector.xpath('//*[@class="a"]/ancestor::li/text()').extract()).replace('\n','').strip()       

    In [3]: el
    Out[3]: 'Text1        Text7'

    In [4]: import re

    In [5]: txt = re.sub(r'\s+',' ',el)

    In [6]: txt
    Out[6]: 'Text1 Text7'

    In [7]: sel =' '.join(selector.xpath('//*[@class="a"]/ancestor::ul//li//text()').extract()).replace('\n','').strip( 
       ...: )

    In [8]: sel
    Out[8]: 'Text2 Text3        Text4         Text5                    Text6 .                                         Text7                 Text8         Text9         Text10 .'

    In [9]: txt2 = re.sub(r'\s+',' ',sel)

    In [10]: txt2
    Out[10]: 'Text2 Text3 Text4 Text5 Text6 . Text7 Text8 Text9 Text10 .'
baubqpgj

baubqpgj2#

当你使用Selector时,你有两个选项来修复它:
在路径中添加html和body标记

selector.xpath('/html/body/li//text()').extract() 
selector.xpath('/html/body/li//text()').extract()

或者您可以使用相对xpath选择器//

selector.xpath('//li//text()').extract() 
selector.xpath('//li//text()').extract()

相关问题