python - 当我使用 xpath 从网站提取信息时没有收集数据
问题描述
我需要从网站中提取信息。该网站在以下路径中有信息:
<div class="accordion-block__question">
<div class="accordion-block__text">Server</div></div>
...
<div class="block__col"><b>Country</b></div>
跑步
try:
# Country
c=driver.find_element_by_xpath("//div[contains(@class,'block__col') and contains(text(),'Country')]").get_attribute('textContent')
country.append(c)
except:
country.append("Error")
我创建了一个包含所有错误的 df。我对所有领域都感兴趣(但要解决这个问题,只有一个会很棒),包括 Trustscore(数字),但我不知道是否有可能得到它。我在 Chrome 上使用 selenium,网络驱动程序。该网站是https://www.scamadviser.com/check-website。
代码
这是整个代码:
def scam(df):
chrome_options = webdriver.ChromeOptions()
trust=[]
country = []
isp_country = []
query=df['URL'].unique().tolist()
driver=webdriver.Chrome('mypath',chrome_options=chrome_options))
for x in query:
wait = WebDriverWait(driver, 10)
response=driver.get('https://www.scamadviser.com/check-website/'+x)
try:
wait = WebDriverWait(driver, 30)
# missing trustscore
# Country
c=driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", driver.find_element_by_xpath("//div[contains(@class,'block__col') and contains(text(),'Country')]")).get_attribute('innerText')
country.append(c)
# ISP country
ic=driver.find_element_by_xpath("//div[contains(@class,'block__col') and contains(text(),'ISP')]").get_attribute('innerText')
isp_country.append(ic)
except:
# missing trustscore
country.append("Error")
isp_country.append("Error")
# Create dataframe
dict = {'URL': query, 'Trustscore':trust, 'Country': country, 'ISP': isp_country}
df=pd.DataFrame(dict)
driver.quit()
return df
例如,您可以尝试使用 df['URL'] 等于
stackoverflow.com
gitHub.com
解决方案
你要找的innerText
不是textContent
。
代码 :
try:
# Country
c = driver.find_element_by_xpath("//div[contains(@class,'block__col') and contains(text(),'Country')]").get_attribute('innerText')
print(c)
country.append(c)
except:
country.append("Error")
更新1:
如果已经使用的定位器是正确的。
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", driver.find_element_by_xpath("//div[contains(@class,'block__col') and contains(text(),'Country')]"))
或者可以尝试使用此 xpath 的两个选项:-
//div[contains(@class,'block__col')]/b[text()='Country']
更新2:
尝试:wait = WebDriverWait(driver, 30) # 缺少信任分数
# Country
time.sleep(2)
ele = driver.find_element_by_xpath("//div[contains(@class,'block__col')]/b[text()='Country']")
driver.execute_script("arguments[0].scrollIntoView(true);", ele)
country.append(ele.get_attribute('innerText'))
time.sleep(2)
# ISP country
ic = driver.find_element_by_xpath("//div[contains(@class,'block__col')]/b[text()='ISP']")
driver.execute_script("arguments[0].scrollIntoView(true);", ele)
isp_country.append(ic.get_attribute('innerText'))
更新3:
得到Company data
, Country name
.
使用这个xpath:
//div[text()='Company data']/../following-sibling::div/descendant::b[text()='Country']/../following-sibling::div
另外,在使用这个 xpath 之前确保一些事情。
- 以全屏模式启动浏览器。
- 使用 js 滚动,然后使用 sroll 进入视图或动作链。
代码 :-
driver.maximize_window()
time.sleep(2)
driver.execute_script("window.scrollTo(0, 1000)")
time.sleep(2)
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Company data']"))))
# now use the mentioned xpath.
company_data_country_name` = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Company data']/../following-sibling::div/descendant::b[text()='Country']/../following-sibling::div")))
print(company_data_country_name.text)
推荐阅读
- flutter - 需要帮助将数组列表集成到 Flutter GridView
- python - 父模板的 CSS 属性是否适用于 Django 中的扩展子模板?
- java - 检测数组中的3个连续奇数或偶数
- swiftui - 如何在一个 VStack 中添加两个 NavigationLink
- angular - 如何在角度 UI 中访问 CurrentUser 的角色?使用 Abp v2.9
- javascript - 用户定义的函数未按要求实现。逻辑以某种方式失败
- r - 如何在 ggplot 2 scale_y_continuous(trans = "reverselog") 中设置中断
- sql - postgresql查询返回从今天起两年后每月第一天的星期几
- c++ - 如何将向量分配给特征中的矩阵
- java - 程序员何时以及为什么在 Java 中使用八进制和十六进制文字?