XPath中的类和范围搜索

2024-04-20 12:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个googleplay商店刮刀,从一个特定的应用程序刮评论,并写评论到一个文件。为此,我使用Python Selenium在这里搜索所有评论:https://play.google.com/store/apps/details?id=com.grabtaxi.passenger&showAllReviews=true,然后提取出所有评论。你知道吗

所有评论都被确定在一个特定的类zc7KVe中,因此我为获取所有评论而确定的XPath是: //div[@class='zc7KVe']。你知道吗

这是Python中的一行代码,用于使用上述XPath查找此类元素,这是在while循环中完成的: reviews = driver.find_elements(By.XPATH, '//div[@class=\'zc7KVe\']'

问题是当我继续向下滚动页面时,reviews变量的长度会越来越大。这是因为上面的XPath搜索满足条件的所有元素。这会导致刮取操作所用的时间成倍增加(例如,向下滚动页面80次后,刮取240个新的评论集所用的时间超过了20分钟,而我第一次开始时只花了30秒)。你知道吗

为了加快速度,我正在探索在XPath中包含position(),这样就不需要提取出满足条件的所有元素。我研究了this,并尝试在Chrome开发工具(如//div[contains(@class,'zc7KVe') and (position() >= 100) and not (position > 200)])中测试XPath,但没有结果。你知道吗

是否有一个XPath可以满足特定类和范围的搜索?你知道吗

添加

在DevTools中检查时,HTML的结构如下所示:

<div jscontroller="..." jsmodel="..." jsdata="..." ...>
    <div class="zc7KVe">
        <!-- One review -->
<div jscontroller="..." jsmodel="..." jsdata="..." ...>
    <div class="zc7KVe">
        <!-- One review -->
<!-- and so on -->

Tags: anddivcom元素时间评论position页面
1条回答
网友
1楼 · 发布于 2024-04-20 12:40:01

有多种不同的方法可以提高性能:

  • 首先向上滚动,直到获得所有评论(或某个数字),然后才将它们提取出来
  • 让HTML解析器执行HTML解析,这样可以减少JSON over HTTPselenium命令的数量以及通过selenium webdriver查找元素的其他开销。您可以获取review部分的内部/外部HTML,并使用^{}等工具对其进行解析。大致如下:

    In [8]: reviews = driver.find_element_by_xpath("//h3[. = 'User reviews']/following-sibling::div[1]")
    
    In [9]: soup = BeautifulSoup(reviews.get_attribute("outerHTML"), "lxml")
    
    In [10]: for review in soup.div.find_all("div", jscontroller=True, recursive=False):
                 author = review.find(class_="X43Kjb").get_text()
                 print(author)   
    Angie Lin
    Danai Sae-Han
    Siwon's Armpit Hair
    Vishal Mehta
    Ann Leong
    V. HD
    Mark Stephen Masilungan 
    ...
    Putra Pandu Adikara
    kei tho
    Phụng Nguyễn
    
  • 记住最后一个元素,并使用^{} axis在该元素后面提取以下同级元素
  • 您还可以查看Google Play API和官方或非官方客户端(如this one),这可能有助于您从不同的角度看待问题
  • 而且,如果您仍在使用XPath方法,并使用position()按“范围”筛选内容,那么您可以在容纳评论的容器的范围内进行操作:

    //div[@jsmodel = 'y8Aajc' and position() >= 10 and position() <= 20]
    

相关问题 更多 >