- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,这是website (首先将其翻译成英文)使用javascript显示有关公司的信息(您需要点击“地址和电话号码”)。我用 selenium 做到了(点击链接),现在我尝试使用 css 选择器收集有关这些公司的信息(电话、地址等)并保存到数据库。但我无法正确地将信息保存到数据库中,因为我无法将有关公司的信息保存在所需的变量中。
这是我的代码(这是错误的):
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get 'http://www.ypag.ru/cat/komp249/page0.html'
driver.find_elements(:css, '.p2 div a').each {|link| link.click}
driver.find_elements
(:css, '.p3 a, .firm, .p2 table tr:nth-child(1) .p, .p2 table tr:nth-child(2) .p,
p2 table tr:nth-child(3) .p, .p2 table tr:nth-child(4) .p').each {|n,r,c,k,l,m|
name = n
region = r
field1 = c
field1 k
field1 l
field1 m }
我的目的是将每个CSS选择器保存在正确的变量中,这可能吗?我已经问过这个question ,但是我没有地址、电话等的 CSS 选择器。
如果我需要添加其他信息,请告诉我
最佳答案
该页面的 html 不是很好 - 即没有好的标识符来关联数据。例如,只有相对定位才允许您将公司名称与地址相关联。
下面的解决方案对文本的位置做出了假设,虽然很脆弱,但这是我能想到的最好的解决方案。
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.navigate.to 'http://www.ypag.ru/cat/komp249/page0.html'
# The table that contains all of the data
# This xpath is not ideal (brittle) but I could not find a better identifier)
table = driver.find_element(:xpath, '/html/body/table[4]/tbody/tr/td[2]/table')
# Expand all of the address links
table.find_elements(:css, 'a[href *= loadadress]').each(&:click)
# Get all of the rows that contain data
# Need to ignore blanks, ads, etc.
data_elements = table.find_elements(:xpath, './tbody/tr').keep_if do |row|
row.find_elements(:css, '.p3, .p, .p2').length > 0
end
# Of the rows we have, each set of three rows represents a company
# Iterate through each set of three rows to collect data
data_elements.each_slice(3) do |company|
name = company[0].find_element(:css, '.p3').text
firm = company[0].find_element(:css, '.firm').text
firm_split = firm.split(' » ')
country = firm_split[0]
city = firm_split[1]
description = company[1].text
# Get the address values matching, using the icons to determine the rows meaning
# Note that not every company has each detail, in which case the value will be ''
url = ''
email = ''
phone = ''
address = ''
# Wait to ensure the address block has been loaded
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
element = wait.until { company[2].find_element(:css, 'div[id*=adressSelector]') }
end
sub_table_data = company[2].find_elements(:css, 'div[id*=adressSelector] tr')
sub_table_data.each do |row|
cells = row.find_elements(:css, 'td')
case cells[0].find_element(:css, 'img').attribute('src')
when /papers/
url = cells[1].text
when /mail/
email = cells[1].text
when /mobile/
phone = cells[1].text
when /map/
address = cells[1].text
end
end
# Output the results (or whatever you want them for)
puts name
puts country
puts city
puts description
puts url
puts email
puts phone
puts address
puts
end
作为示例,上面的代码将提供有关第一家公司的以下详细信息(请注意,这是翻译成英文的页面):
Storm-Print
Russia »Moscow
Printing Services: stationery, flyers, leaflets, brochures.
http://www.storm-print.ru
info@storm-print.ru
+7 (495) 101-37-62 multichannel Fax: +7 (495) 101-37-62 multichannel
Russia "Moscow ul.Suschevsky shaft 16, page 4, 127018
仅供引用,公司的 html 如下所示:
<tr>
<td align="left" class="p3">
<a href="http://www.msyp.ru/cat/kompaniy992511/s-779665944.html">
<font>
<font class="">
Storm-Print
</font>
</font>
</a>
</td>
<td align="right" class="firm">
<font>
<font>
Russia >
Moscow
</font>
</font>
</td>
</tr>
<tr>
<td align="left" colspan="2" width="100%" class="p">
<font>
<font class="">
Printing Services: stationery, flyers, leaflets, brochures.
</font>
</font>
<br>
</td>
</tr>
<tr>
<td colspan="2" align="right">
<font>
<font>
Rating:
</font>
</font>
<a class="iframe2" href="reit/r.php?id=992511">
<img src="fon/star_reit_off.png" border="0">
<img src="fon/star_reit_off.png" border="0">
<img src="fon/star_reit_off.png" border="0">
<img src="fon/star_reit_off.png" border="0">
<img src="fon/star_reit_off.png" border="0">
</a>
</td>
</tr>
<tr>
<td colspan="2">
<table class="p2" border="0" width="100%" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td align="left">
<div id="adressSelector992511">
<table>
<tbody>
<tr>
<td>
<img src="http://www.ypag.ru/fon/papers.gif" border="0">
</td>
<td class="p">
<a href="http://www.storm-print.ru" target="_blank">
<font>
<font class="">
http://www.storm-print.ru
</font>
</font>
</a>
</td>
</tr>
<tr>
<td>
<img src="http://www.ypag.ru/fon/mail.gif" border="0">
</td>
<td class="p">
<a href="mailto:info@storm-print.ru">
<font>
<font class="">
info@storm-print.ru
</font>
</font>
</a>
</td>
</tr>
<tr>
<td>
<img src="http://www.ypag.ru/fon/mobile.gif" border="0">
</td>
<td class="p">
<font>
<font class="">
+7 (495) 101-37-62 multichannel Fax: +7 (495) 101-37-62 multichannel
</font>
</font>
</td>
</tr>
<tr>
<td>
<img src="http://www.ypag.ru/fon/map.gif" border="0">
</td>
<td class="p">
<font>
<font class="">
Russia "Moscow ul.Suschevsky shaft 16, page 4, 127018
</font>
</font>
</td>
</tr>
<tr>
<td>
<img src="http://ypag.ru/fon/editdelete.png" border="0">
</td>
<td align="left" class="p">
<a href="http://www.ypag.ru/edit_kompany.php?idkomp=992511&c=3770450052" target="_blank" onclick="popupWin = window.open(this.href, 'contacts', 'location,width=600,height=500,top=0,scrollbars=yes'); popupWin.focus(); return false;">
<font>
<font>
Report incorrect data
</font>
</font>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
关于javascript - 用于解析的 Selenium-webdriver (Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18466935/
我在为 MacOSX 构建的独立包中添加 DMG 背景的自定义图标时遇到问题。我在项目的根目录中添加了一个包。正在从中加载自定义图标,但没有加载 DMG 背景图标。我正在使用 Java fx 2.2.
Qt for Symbian 和 Qt for MeeGo 有什么区别?我知道 Qt 是一个交叉编译平台。这是否意味着如果我使用来自 Qt 的库,完全相同的库可以在所有支持 Qt 的设备(例如 Sym
我正在尝试使用 C# .NET 3.5/4.0 务实地运行 SQL Server 数据库的备份。我已经找到了如何完成此操作,但是我似乎找不到用于备份的命名空间库。 我正在寻找 Microsoft.Sq
我最近在疯狂学习 Java,但我通常是一名 .NET 开发人员。 (所以请原谅我的新手问题。) 在 .Net 中,我可以在不使用 IIS 的情况下开发 ASP.Net 页面,因为它有一个简化的 Web
这post仅当打印命令中有字符串时才有用。现在我有大量的源代码,其中包含一条声明,例如 print milk,butter 应该格式化为 print(milk,butter) 用\n 捕获行尾并不成功
所以我的问题是: https://gist.github.com/panSarin/4a221a0923927115584a 当我保存这个表格时,我收到了标题中的错误 NoMethodError (u
如何让 Html5 音频在点击时播放声音? (ogg 用于 Firefox 等浏览器,mp3 用于 chrome 等浏览器) 到目前为止,我可以通过 onclick 更改为单个文件类型,但我无法像在普
如果it1和it2有什么区别? std::set s; auto it1 = std::inserter(s, s.begin()); auto it2 = std::inserter(s, s.en
4.0.0 com.amkit myapp SpringMVCFirst
我目前使用 Eclipse 作为其他语言的 IDE,而且我习惯于不必离开 IDE 做任何事情 - 但是我真的很难为纯 ECMAScript-262 找到相同或类似的设置。 澄清一下,我不是在寻找 DO
我想将带有字符串数组的C# 结构发送到C++ 函数,该函数接受void * 作为c# 结构和char** 作为c# 结构字符串数组成员。 我能够将结构发送到 c++ 函数,但问题是,无法从 c++ 函
我正在使用动态创建的链接: 我想为f:param附加自定义转换器,以从#{name}等中删除空格。 但是f:param中没有转换器
是否可以利用Redis为.NET创建后写或直写式缓存?理想情况下,透明的高速缓存是由单个进程写入的,并且支持从数据库加载丢失的数据,并每隔一段时间持久保存脏块? 我已经搜查了好几个小时,也许是goog
我正在通过bash执行命令的ssh脚本。 FILENAMES=( "export_production_20200604.tgz" "export_production_log_2020060
我需要一个正则表达式来出现 0 到 7 个字母或 0 到 7 个数字。 例如:匹配:1234、asdbs 不匹配:123456789、absbsafsfsf、asf12 我尝试了([a-zA-Z]{0
我有一个用于会计期间的表格,该表格具有期间结束和开始的开始日期和结束日期。我使用此表来确定何时发生服务交易以及何时在查询中收集收入,例如... SELECT p.PeriodID, p.FiscalY
我很难为只接受字符或数字的 Laravel 构建正则表达式验证。它是这样的: 你好<-好的 123 <- 好的 你好123 <-不行 我现在的正则表达式是这样的:[A-Za-z]|[0-9]。 reg
您实际上会在 Repeater 上使用 OnItemDataBound 做什么? 最佳答案 “此事件为您提供在客户端显示数据项之前访问数据项的最后机会。引发此事件后,数据项将被清空,不再可用。” ~
我有一个 fragment 工作正常的项目,我正在使用 jeremyfeinstein 的 actionbarsherlock 和滑动菜单, 一切正常,但是当我想自定义左侧抽屉列表单元格时,出现异常
最近几天,我似乎平均分配时间在构建我的第一个应用程序和在这里发布问题!! 这是我的第一个应用程序,也是我们的设计师完成的第一个应用程序。我试图满足他所做的事情的外观和感觉,但我认为他没有做适当的事情。
我是一名优秀的程序员,十分优秀!