XPathExpression
可以使用Java自己的(自Java 1.5开始存在)
XPathExpression
可以使用Java自己的(自Java 1.5开始存在)
Answers:
在Ruby世界中,相当于Beautiful Soup的是why_the_lucky_stiff的Hpricot。
在.NET世界中,我建议使用HTML Agility Pack。虽然不如上述某些选项(例如HTMLSQL)那么简单,但它非常灵活。它使您可以处理格式不正确的HTML,就像处理格式正确的XML一样,因此您可以使用XPATH或仅在节点上进行迭代。
BeautifulSoup是HTML抓取的好方法。我以前的工作是让我做很多工作,我希望我刚开始时就了解BeautifulSoup。就像DOM有很多有用的选项一样,并且还有很多pythonic。如果您想尝试使用Ruby,则可以移植BeautifulSoup并将其命名为RubyfulSoup,但是它已经有一段时间没有更新了。
其他有用的工具是HTMLParser或sgmllib.SGMLParser,它们是标准Python库的一部分。每次您输入/退出标签并遇到html文本时,这些方法就会通过调用方法来工作。如果您熟悉的话,他们就像Expat。如果要解析非常大的文件,并且创建DOM树将很长且昂贵,则这些库特别有用。
正则表达式不是非常必要。BeautifulSoup处理正则表达式,因此,如果需要它们的强大功能,可以在这里使用它。我说与BeautifulSoup一起使用,除非您需要速度和较小的内存占用。如果您在Python上找到了更好的HTML解析器,请告诉我。
我发现HTMLSQL是一种非常简单的屏幕抓取方法。从字面上看,花费数分钟即可获得结果。
查询是超直观的,例如:
SELECT title from img WHERE $class == 'userpic'
现在还有其他一些采用相同方法的替代方法。
Python除了Beatiful Soup之外,还有多种HTML抓取选项。以下是一些其他内容:
为什么没有人提到Java的JSOUP?http://jsoup.org/
来自Django的 Adrian Holovaty 的templatemaker实用程序使用了一种非常有趣的方法:向其提供同一页面的变体,并“学习”变量数据的“漏洞”所在的位置。它不是特定于HTML的,因此也适用于抓取其他任何纯文本内容。我还将它用于转换为纯文本的PDF和HTML(分别使用pdftotext和lynx)。
我知道并喜欢Screen-Scraper。
屏幕抓取工具是一种用于从网站提取数据的工具。屏幕抓取工具可自动执行以下操作:
* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)
常见用途:
* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data
技术:
* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers
三种版本的屏幕抓取器:
* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.
require 'hpricot'
Shoes.app :title => "Ask Stack Overflow", :width => 370 do
SO_URL = "http://stackoverflow.com"
stack do
stack do
caption "What is your question?"
flow do
@lookup = edit_line "stackoverflow", :width => "-115px"
button "Ask", :width => "90px" do
download SO_URL + "/search?s=" + @lookup.text do |s|
doc = Hpricot(s.response.body)
@rez.clear()
(doc/:a).each do |l|
href = l["href"]
if href.to_s =~ /\/questions\/[0-9]+/ then
@rez.append do
para(link(l.inner_text) { visit(SO_URL + href) })
end
end
end
@rez.show()
end
end
end
end
stack :margin => 25 do
background white, :radius => 20
@rez = stack do
end
end
@rez.hide()
end
end
Perl的另一个选择是基于Ruby的Scrapi的Web :: Scraper。简而言之,使用简洁的语法,您可以将健壮的抓取工具直接放入数据结构中。
.NET的另一个工具是MhtBuilder
也有此解决方案:netty HttpClient
我在Ruby上使用Hpricot。举例来说,这是一段代码片段,我可以使用它从我的HireThings帐户的六页中检索所有书名(因为它们似乎并未提供包含此信息的单个页面):
pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
pagerange.each do |page|
resp, data = http.get "/perth_dotnet?page=#{page}"
if resp.class == Net::HTTPOK
(Hpricot(data)/"h3 a").each { |a| puts a.innerText }
end
end
end
差不多完成了。在此之前的所有操作都是库导入和我的代理的设置。
尽管它是为.NET Web测试而设计的,但我一直为此目的而使用WatiN框架。由于它是基于DOM的,因此捕获HTML,文本或图像非常容易。最近,我用它将MediaWiki所有页面名称空间查询中的链接列表转储到Excel电子表格中。下面的VB.NET代码片段非常粗糙,但是可以正常工作。
Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)
Dim PagesLink As Link
For Each PagesLink In PagesIE.TableBodies(2).Links
With MyWorkSheet
.Cells(XLRowCounterInt, 1) = PagesLink.Text
.Cells(XLRowCounterInt, 2) = PagesLink.Url
End With
XLRowCounterInt = XLRowCounterInt + 1
Next
End Sub
我用过LWP和 Perl中 HTML :: TreeBuilder,并且发现它们非常有用。
LWP(libwww-perl的缩写)可让您连接到网站并刮取HTML,您可以在此处获取该模块以及O'Reilly的书似乎在此处在线。
TreeBuilder允许您从HTML构造树,并且HTML :: TreeBuilder-构建HTML语法树的解析器中提供了文档和源代码。。
但是,与这种方法相比,可能还有很多繁重的工作要做。我没有看另一个答案建议的“ 机械化”模块,所以我很可能会这样做。
好吧,如果您希望仅使用浏览器从客户端完成此操作,则可以使用jcrawl.com。从Web应用程序(http://www.jcrawl.com/app.html)设计了抓取服务之后,只需要将生成的脚本添加到HTML页面即可开始使用/呈现数据。
所有的抓取逻辑都是通过JavaScript在浏览器上发生的。希望对你有帮助。单击此链接以获取从Yahoo网球中提取最新新闻的实时示例。
您可能已经拥有了很多,但是我认为这是您想要做的:
from __future__ import with_statement
import re, os
profile = ""
os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
for line in f:
profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")
我使用SgmlReader在.NET中混合了各种结果,它最初是由Chris Lovett启动的,并且似乎已经由MindTouch更新了。
我喜欢Google Spreadsheets的ImportXML(URL,XPath)函数。
如果您的XPath表达式返回多个值,它将在列下重复单元格。
importxml()
一个电子表格上最多可以有50个功能。
RapidMiner的Web插件也非常易于使用。它可以发布帖子,接受cookie并可以设置user-agent。