Python XPath中的类和范围搜索
我目前正在做一个Google Play商店刮板,它从一个特定的应用程序中刮取评论并将评论写入一个文件。为此,我使用Python Selenium在此处搜索所有评论:,然后提取所有评论 所有评论都被确定在一个特定的类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
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()