有什么方法可以使用 Python 从该页面抓取命令吗?
Is there any way to scrape the commands from this page using Python?
我已经使用 beautifulsoup 进行了一些基本的文本抓取,但对于此页面 (http://reference.wolfram.com/language/ref/BarChart.html),相关文本的格式为图像。可以单击每个单独的命令(例如 BarChart[{1, 2, 3}])来复制它并手动粘贴它,但我想知道是否有一种合理的方法可以获得所有 143 个命令,而无需对每个命令都这样做一段代码。
虽然这可能有点矫枉过正,但您可以使用 selenium,基本上可以自动执行鼠标单击操作并使用 clipboard 包来取回复制的文本进入 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
文件,看看是否有简单的解决方法。希望对你有帮助。
如果您在与页面交互时查看浏览器的开发工具,您会发现将鼠标悬停在其中一个 image/text 元素上会请求加载该元素的文本。因此,您必须为每个文本发出一个请求才能获取所有这些值。这些网址看起来都像这样:http://reference.wolfram.com/language/ref/Files/BarChart.en/i_5.txt.
所以首先,您应该找到一种生成所有这些请求的方法。看起来它们都是奇数值(i_1.txt
、i_3.txt
等)并且它们对应于 div
的 id。
虽然这些文字看起来不太好看,但它有很多标记并且文字被转义了:
<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>
正如一些人指出的那样,clipboard.js
是可以找到发起和处理这些请求的 javascript 的地方。您可以通过检查元素的事件侦听器或跟踪请求的发起程序堆栈来到达那里。这有一些行可以用来编写一个 Python 函数来抓取它们。有一个名为 PyQuery (docs) 的库,可让您在 HTML 上使用类似 jQuery 的选择器,从而加快速度。
我已经使用 beautifulsoup 进行了一些基本的文本抓取,但对于此页面 (http://reference.wolfram.com/language/ref/BarChart.html),相关文本的格式为图像。可以单击每个单独的命令(例如 BarChart[{1, 2, 3}])来复制它并手动粘贴它,但我想知道是否有一种合理的方法可以获得所有 143 个命令,而无需对每个命令都这样做一段代码。
虽然这可能有点矫枉过正,但您可以使用 selenium,基本上可以自动执行鼠标单击操作并使用 clipboard 包来取回复制的文本进入 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
文件,看看是否有简单的解决方法。希望对你有帮助。
如果您在与页面交互时查看浏览器的开发工具,您会发现将鼠标悬停在其中一个 image/text 元素上会请求加载该元素的文本。因此,您必须为每个文本发出一个请求才能获取所有这些值。这些网址看起来都像这样:http://reference.wolfram.com/language/ref/Files/BarChart.en/i_5.txt.
所以首先,您应该找到一种生成所有这些请求的方法。看起来它们都是奇数值(i_1.txt
、i_3.txt
等)并且它们对应于 div
的 id。
虽然这些文字看起来不太好看,但它有很多标记并且文字被转义了:
<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>
正如一些人指出的那样,clipboard.js
是可以找到发起和处理这些请求的 javascript 的地方。您可以通过检查元素的事件侦听器或跟踪请求的发起程序堆栈来到达那里。这有一些行可以用来编写一个 Python 函数来抓取它们。有一个名为 PyQuery (docs) 的库,可让您在 HTML 上使用类似 jQuery 的选择器,从而加快速度。