Groovy htmlunit getFirstByXPath返回null + OCR问题

时间:2011-01-08 18:15:50

标签: html groovy screen-scraping htmlunit

我有一些问题,HtmlUnit最近返回空值,我正在寻找指导。我抓住网站第一行的每个结果都返回null。我想知道是否有人可以

A)解释为什么他们可能会返回null

B)解释获取信息的更好方法(如果有的话)

这是我当前的代码(URL在源代码中):

client = new WebClient(BrowserVersion.FIREFOX_3)
client.javaScriptEnabled = false

def url = "http://www.hidemyass.com/proxy-list/"

page = client.getPage(url)

IpAddress = page.getFirstByXPath("//html/body/div/div/form/table/tbody/tr/td[2]").getValue()
println "IP Address is: $data"          //returns null

//Port_Number is an Image

Country = page.getFirstByXPath("//html/body/div/div/form/table/tbody/tr/td[4][@class='country']/@rel").getValue()
println "Country abbreviation is: $Country"

//differentiate speed and connection by name of gif?

Type = page.getFirstByXPath("//html/body/div/div/form/table/tbody/tr/td[7]").getValue()
println "Proxy type is: $Type"

Anonymity = page.getFirstByXPath("//html/body/div/div/form/table/tbody/tr/td[8]").getValue()
println "Anonymity Level is: $Anonymity"

client.closeAllWindows()

现在我的所有XPath都返回null,而.getValue()显然不能用于null。

我对 PORT 应该怎么做也有疑问,因为它是一张图片?有没有比下载它并尝试通过OCR解决它更好的选择?

旁注

这个网站没有任何意义,我只是在寻找一个我可以练习抓取的网站(最后一个我遇到了片段身份问题但无法得到答案:HtmlUnit getByXpath returns nullHtmlUnit and Fragment Identities

1 个答案:

答案 0 :(得分:1)

看起来您的xpath查询不正确。根据代码示例中提供的url,应从搜索路径中删除表单元素。

alt text

这是一个xpath查询,当页面布局发生变化时,它不易破解。

//table[@id='proxylist-table']/tbody/tr/td[2]

就端口号而言,该页面的作者必须希望由于某种原因不能抓取该部分数据。做OCR可能是你最好的选择。

但是,您可以做的一件事是查看返回的图像大小以猜测端口号。例如,我注意到显示端口80的图像都具有406或411的内容长度。端口8080是402或409.图像有两种不同的尺寸与行颜色混合。如果Url以1结尾,则它将具有白色背景,如果它以0结束,则它将具有浅灰色背景并且总是大几个字节。这种方法有明显的缺点,但它可能有用。