0

HtmlXPathSelector(response)在 Scrapy 中使用对象,我需要获取两种文本格式:

我的第一个文本具有以下格式:

<p> Text, text, text, text, text, text, text, text, text </p>
<p>
<p> Text, text, text, text, text. </p>

我的第二个文本具有以下格式:

Text, text, text, text, text, text
<br>
<br>
Text, text, text..
<br>
<br>

当我使用x.select('//div[@id="texto"]/text()').extract()但不是第二个时......我得到这样的东西:

'content': [u'\r\n          ',
                 u'\r\n',
                 ...
                 u'\r\n']

当我使用时,x.select('//div[@id="texto"]/p/text()').extract()我得到第二个但不是第一个:

我怎样才能使用一种规则来获得两种格式?

更新:

我得到了下一个代码的解决方案,但我觉得这是一个肮脏的解决方案:

content = x.select('//div[@id="nota_texto"]/p/text()').extract()
if content == []:
    data['content'] = x.select('//div[@id="nota_texto"]/text()').extract()
else:
    data['content'] = content

更新 2:

可以使用双斜杠//,但是现在我正在获取表格的内容,因为 HTML 具有以下格式:

<div id="texto">
      <table>
        Undesired content
      </table>
       Desired content.
</div>

如何避免获得“不受欢迎的内容”?

更新 3:

我在 Scrapy Users Google Groups 中收到了 Steven Almeroth 的回答:

使用以下兄弟姐妹:

x.select('id("texto")/table/following-sibling::node()').extract()

有用!

4

2 回答 2

1

因此,您想要 id 为“texto”的 div 中的所有文本及其子项?
如果是这种情况,这应该有效:

x.select('//div[@id="texto"]//text()').extract()


如果这对您来说太笼统,您可以使用|运算符匹配多个 xpath。

'<xpath1>|<xpath2>'

编辑:

如果'//text()' xpath 得到的比你想要的多,你应该更具体。
这就是|进来的地方。试试类似的东西:

x.select('//div[@id="texto"]/text() | //div[@id="texto"]/p/text()')
于 2012-11-05T23:03:28.540 回答
1

试试这个 Xpath 查询:

string(//div[@id="texto"])
于 2012-11-06T10:31:42.293 回答