Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XPath中的类和范围搜索_Python_Selenium_Xpath - Fatal编程技术网

Python XPath中的类和范围搜索

Python XPath中的类和范围搜索,python,selenium,xpath,Python,Selenium,Xpath,我目前正在做一个Google Play商店刮板,它从一个特定的应用程序中刮取评论并将评论写入一个文件。为此,我使用Python Selenium在此处搜索所有评论:,然后提取所有评论 所有评论都被确定在一个特定的类zc7KVe中,因此我为获取所有评论而确定的XPath是: //div[@class='zc7KVe'] 这是Python中用于使用上述XPath查找此类元素的代码行,这是在while循环中完成的: reviews=driver.find_元素(By.XPATH,//div[@clas

我目前正在做一个Google Play商店刮板,它从一个特定的应用程序中刮取评论并将评论写入一个文件。为此,我使用Python Selenium在此处搜索所有评论:,然后提取所有评论

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

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

问题是,当我继续向下滚动页面时,
reviews
变量的长度会越来越大。这是因为上面的XPath搜索所有满足条件的元素。这会导致刮取操作所花费的时间呈指数级增加(例如,在将页面向下滚动80次后,我花了20多分钟才抓取了240组新的评论,而我第一次开始时只花了30秒)

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

是否有XPath可以满足特定类和范围的搜索

添加

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

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

这里有多种不同的方法来提高性能:

  • 首先向上滚动,直到获得所有评论(或某个数字),然后才将其提取出来
  • 让HTML解析器进行HTML解析,这样可以减少selenium命令的数量以及通过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
    
  • 记住最后一个元素,你已经从中得到了一个评论,并使用它在这个元素之后提取以下同级元素
  • 您还可以查看GooglePlayAPI和官方或非官方客户端(如),这可能有助于您从不同的角度看待问题
  • 而且,如果您仍在使用XPath方法,并使用
    position()
    按“范围”筛选出内容,那么您只需在容纳评论的容器的范围内操作即可:

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

    //div[@jsmodel='y8Aajc'和position()>=10和position()这里有多种不同的方法来提高性能:

    • 首先向上滚动,直到获得所有评论(或某个数字),然后才将其提取出来
    • 让HTML解析器进行HTML解析,这样可以减少selenium命令的数量以及通过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
      
    • 记住最后一个元素,你已经从中得到了一个评论,并使用它在这个元素之后提取以下同级元素
    • 您还可以查看GooglePlayAPI和官方或非官方客户端(如),这可能有助于您从不同的角度看待问题
    • 而且,如果您仍在使用XPath方法,并使用
      position()
      按“范围”筛选出内容,那么您只需在容纳评论的容器的范围内操作即可:

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