我已经使用beautifulsoup来做一些基本的文本抓取,但是对于这个页面(http://reference.wolfram.com/language/ref/BarChart.html),所讨论的文本被格式化为图像。可以点击每个单独的命令(例如BarChart [{1,2,3}])来复制它并手动粘贴它,但我想知道是否有一种合理的方法可以获得所有143个命令而不会为每个人执行此操作一段代码。
答案 0 :(得分:0)
虽然这可能是一种矫枉过正,但您可以使用selenium,基本上可以自动执行鼠标单击操作,并使用剪贴板包将复制的文本复制回Python。一个粗略的想法是:
from selenium import webdriver
import clipboard
driver = webdriver.Chrome()
driver.get("http://reference.wolfram.com/language/ref/BarChart.html")
#get all the image elements
elem: = driver.find_elements_by_tag_name("img")
#click and paste
text_list = []
for elem in elems:
#clicking on the image element
elem.click()
#get text from clipboard
text = clipboard.paste()
#check if text is empty
if text != "":
text_list.append(text)
正如我所说,这可能不是最好的方法,你可以查看网站上的clipboard.js
文件来检查是否有一个简单的方法。希望它有所帮助。
答案 1 :(得分:0)
如果您在与网页交互时观看浏览器的开发工具,则会看到将鼠标悬停在其中一个图片/文字元素上会请求加载该元素的文字。因此,您必须为每个文本发出一个请求以获取所有这些值。网址都看起来像这样:http://reference.wolfram.com/language/ref/Files/BarChart.en/i_5.txt。
首先,您应该找到一种方法来生成所有这些请求。看起来他们是所有奇数值(searchGestureRecognizer.Tapped += async (s, e) => {
await _viewModel.GetResults();
await _viewModel.GetImagesForResults();
resultsListView.ItemsSource = null;
resultsListView.ItemsSource = _viewModel.Results;
};
,i_1.txt
等),并且它们与i_3.txt
的ID相对应。
这些不会给你很好看的文字,它有很多标记,文字被转义:
div
正如一对人所指出的那样,<pre name='i_5_in' id='i_5_in' class='IFT'>
BarChart[{{1, 2, 3}, {1, 3, 2}, {5, 2}},
ChartLabels -> {"a", "b", "c"}]
</pre><div class='IFU'>
<a name='408182431'></a>http://wolfram.com/xid/0cq0nbvj-g1a1u5</div>
是可以找到启动和处理这些请求的javascript的地方。您可以通过检查元素的事件侦听器或通过跟踪请求的启动器堆栈来到达那里。这有一些行可以用来编写一个可以抓取它们的Python函数。这里有一个名为PyQuery(docs)的库,它允许您在HTML上使用类似jQuery的选择器来加速这一过程。