Python - 使用XPath进行Webscraping

时间:2016-04-02 10:11:01

标签: python html xpath

我正在抓谷歌Playstore。我有一个HTML文本(用户评论)如下: -

<div class="quoted-review">
    <div class="review-text"> <span class="review-title">Awesome :)</span> Trying to learn some basic Lithuanian and pictures are very helpful. I'd love to learn more from who created this app.. &amp;lt;3
        <div class="paragraph-end details-light"></div>
    </div>
</div>

我想使用XPath在类quoted-review中提取完整的文本,即 Awesome :)。尝试学习一些基本的立陶宛语和图片非常有帮助。我很想从创建此应用的人那里了解更多信息..&amp; lt; 3

以下是我的xPath

1)//div[@class='quoted-review review-text']/span[@class='review-title']/text()|//div[@class='quoted-review review-text']/text()

产生一个列表

[
'Awesome :)' , 
'Trying to learn some basic Lithuanian and pictures are very helpful. I'd love to learn more from who created this app..'
]

我希望他们俩都是一个项目。 PS:请不要建议我使用for循环连接索引0和1。我希望他们直接使用Xpath将它们提取为一个。

2)//div[@class='review-text']/text() 只收益

[
'Trying to learn some basic Lithuanian and pictures are very helpful. I'd love to learn more from who created this app..'
]

太棒了:)。错过了。

我可以直接使用soup.select('.quoted-review')[1].getText()作为一个来通过BeautifulSoup获取它,但不能使用Xpath。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在XPath版本1.0(lxml实现的版本)中,您可以调用XPath string()函数来返回元素的有效字符串值,如下所示:

string(//div[@class='review-text'])

请注意,如果内部XPath返回多个元素,则只会考虑第一个元素。要正确支持多个元素,您需要合并一些python代码,例如:

result = [div.xpath('string()') for div in \
            root.xpath('//div[@class='review-text']')]

仅为了您的信息,XPath 2.0支持在路径分隔符之后调用string(),因此您可以使用纯XPath执行此操作:

//div[@class='review-text']/string()