使用 BeautifulSoup 和 Python 从网站提取信息
Extracting information from website with BeautifulSoup and Python
我正在尝试从 this website 中提取信息。无论如何努力都无法获取图像中标记的三个字段(绿色、蓝色和红色矩形)中的文本。
使用下面的函数,我以为我可以成功获取页面上的所有文本,但没有成功:
from bs4 import BeautifulSoup
import requests
def get_text_from_maagarim_page(url: str):
html_text = requests.get(url).text
soup = BeautifulSoup(html_text, "html.parser")
res = soup.find_all(class_ = "tooltippedWord")
text = [el.getText() for el in res]
return text
url = "https://maagarim.hebrew-academy.org.il/Pages/PMain.aspx?koderekh=1484&page=1"
print(get_text_from_maagarim_page(url)) # >> empty list
我尝试使用 Chrome 检查工具和此处提供的确切参考,但我不知道如何使用该数据层次结构来提取所需数据。
如果您对如何访问此数据有任何建议,我很想听听。
更新和更多详细信息
据我从上述网页的结构来看,我要查找的元素在以下结构位置:
<form name="aspnetForm" ...>
...
<div id="wrapper">
...
<div class="content">
...
<div class="mainContentArea">
...
<div id="mainSearchPannel" class="mainSearchContent">
...
<div class="searchPanes">
...
<div class="wordsSearchPane" style="display: block;">
...
<div id="searchResultsAreaWord"
class="searchResultsContainer">
...
<div id="srPanes">
...
<div id="srPane-2" class="resRefPane"
style>
...
<div style="height:600px;overflow:auto">
...
<ul class="esResultList">
...
# HERE IS THE TARGET ITEMS
相关项目如下所示:
相关数据在<td id ... >
您 tag-class 究竟想从网页上抓取什么?当我复制 运行 你的代码时,我包含了这一行来检查页面 html 中的 class 名称,但没有找到。
print("tooltippedWord" in requests.get(url).text) #False
我可以说在使用 find_all 或 findAll 时使用 attrs kwarg 通常更容易。
res = soup.findAll(attrs={"class":"tooltippedWord"})
输入时总体上减少了混乱。就一些可能的方法而言,使用开发工具在 chrome(或其他浏览器)中查看页面以搜索一些 non-random class 标签或 esResultListItem 等 id 标签。
从那里,如果您知道要查找的标签//等等,您可以像这样将其包含在搜索中。
res = soup.findAll("div",attrs={"class":"tooltippedWord"})
如果您知道要查找的标签以及标签中是否包含 class 名称或 ID,肯定会更容易
<span id="somespecialname" class="verySpecialName"></span>
如果您仍在寻找或提供帮助,我可以在明天之前查看,我住的地方已经接近 1:00 AM CST,我仍然需要完成我的 CS 作业。如果您能提供更多示例,我们会更容易为您提供帮助 Pictures/Tags/etc,这样我们就可以知道如何最好地向您解释该过程。
*
有点难以理解文本是什么,但是您要查找的内容是从浏览器发出的单独请求中返回的。希望所使用的参数对您有所帮助。
此请求 returns JSON 数据包含一个 d
条目,其中包含您要查找的 HTML。
下面显示了一个可能的 approach:how 来提取接近您要查找的数据的方法:
import requests
from bs4 import BeautifulSoup
post_json = {"tabNum":3,"type":"Muvaot","kod1":"","sug1":"","tnua":"","kod2":"","zurot":"","kod":"","erechzman":"","erechzura":"","arachim":"1484","erechzurazman":"","cMaxDist":"","aMaxDist":"","sql1expr":"","sql1sug":"","sql2expr":"","sql2sug":"","sql3expr":"","sql3sug":"","sql4expr":"","sql4sug":"","sql5expr":"","sql5sug":"","sql6expr":"","sql6sug":"","sederZeruf":"","distance":"","kotm":"הערך: <b>אֶלָּא</b>","mislifnay":"0","misacharay":"0","sOrder":"standart","pagenum":"1","lines":"0","takeMaxPage":"true","nMaxPage":-1,"year":"","hekKazar":False}
req = requests.post('https://maagarim.hebrew-academy.org.il/Pages/ws/Arachim.asmx/GetMuvaot', json=post_json)
d = req.json()['d']
soup = BeautifulSoup(d, "html.parser")
for num, table in enumerate(soup.find_all('table'), start=1):
print(f"Entry {num}")
tr_row_second = table.find('tr', class_='srRowSecond')
td = tr_row_second.find_all('td')[1]
print(" ", td.strong.text)
tr_row_third = table.find('tr', class_='srRowThird')
td = tr_row_third.find_all('td')[1]
print(" ", td.text)
这将为您提供起始信息:
Entry 1
תעודות בר כוכבא, ואדי מורבעאת 45
המסירה: Mur, 45
Entry 2
תעודות בר כוכבא, איגרת מיהונתן אל יוסה
מראה מקום: <שו' 4> | המסירה: Mur, 46
Entry 3
ברכת המזון
מראה מקום: רחם נא יי אלהינו על ישראל עמך, ברכה ג <שו' 6> (גרסה) | המסירה: New York, Jewish Theological Seminary (JTS), ENA, 2150, 47
Entry 4
ברכת המזון
מראה מקום: נחמנו יי אלהינו, ברכה ד, לשבת <שו' 6> | המסירה: Cambridge, University Library, T-S Collection, 8H 11, 4
我建议你 print(soup)
更好地理解返回的内容。
美汤加载的网页中没有您要的内容。当“网络浏览器”运行s 所述网页中存在 javascript 代码时,它会在单独的 HTTP 请求中获取。 Beautiful Soup不运行javascript.
您可以尝试使用浏览器开发人员工具中的“网络”选项卡找出哪些 HTTP 请求已响应所需数据。如果结果证明这是一个可预测的 HTTP 请求,那么您可以直接在 python 中重新创建该请求,然后使用漂亮的汤来挑选有用的部分。 @Martin Evans 的回答 () 使用这种方法。
或者,您可以使用实际涉及使用 python 远程控制 Web 浏览器的方法。它允许 Web 浏览器加载页面,然后您可以访问 Python 中的 DOM 以从呈现的页面中获取您想要的内容。 Scraping javascript-generated data using Python and scrape html generated by javascript with python 等其他答案可以为您指明方向。
我正在尝试从 this website 中提取信息。无论如何努力都无法获取图像中标记的三个字段(绿色、蓝色和红色矩形)中的文本。
使用下面的函数,我以为我可以成功获取页面上的所有文本,但没有成功:
from bs4 import BeautifulSoup
import requests
def get_text_from_maagarim_page(url: str):
html_text = requests.get(url).text
soup = BeautifulSoup(html_text, "html.parser")
res = soup.find_all(class_ = "tooltippedWord")
text = [el.getText() for el in res]
return text
url = "https://maagarim.hebrew-academy.org.il/Pages/PMain.aspx?koderekh=1484&page=1"
print(get_text_from_maagarim_page(url)) # >> empty list
我尝试使用 Chrome 检查工具和此处提供的确切参考,但我不知道如何使用该数据层次结构来提取所需数据。
如果您对如何访问此数据有任何建议,我很想听听。
更新和更多详细信息
据我从上述网页的结构来看,我要查找的元素在以下结构位置:
<form name="aspnetForm" ...>
...
<div id="wrapper">
...
<div class="content">
...
<div class="mainContentArea">
...
<div id="mainSearchPannel" class="mainSearchContent">
...
<div class="searchPanes">
...
<div class="wordsSearchPane" style="display: block;">
...
<div id="searchResultsAreaWord"
class="searchResultsContainer">
...
<div id="srPanes">
...
<div id="srPane-2" class="resRefPane"
style>
...
<div style="height:600px;overflow:auto">
...
<ul class="esResultList">
...
# HERE IS THE TARGET ITEMS
相关项目如下所示:
相关数据在<td id ... >
您 tag-class 究竟想从网页上抓取什么?当我复制 运行 你的代码时,我包含了这一行来检查页面 html 中的 class 名称,但没有找到。
print("tooltippedWord" in requests.get(url).text) #False
我可以说在使用 find_all 或 findAll 时使用 attrs kwarg 通常更容易。
res = soup.findAll(attrs={"class":"tooltippedWord"})
输入时总体上减少了混乱。就一些可能的方法而言,使用开发工具在 chrome(或其他浏览器)中查看页面以搜索一些 non-random class 标签或 esResultListItem 等 id 标签。
从那里,如果您知道要查找的标签//等等,您可以像这样将其包含在搜索中。
res = soup.findAll("div",attrs={"class":"tooltippedWord"})
如果您知道要查找的标签以及标签中是否包含 class 名称或 ID,肯定会更容易
<span id="somespecialname" class="verySpecialName"></span>
如果您仍在寻找或提供帮助,我可以在明天之前查看,我住的地方已经接近 1:00 AM CST,我仍然需要完成我的 CS 作业。如果您能提供更多示例,我们会更容易为您提供帮助 Pictures/Tags/etc,这样我们就可以知道如何最好地向您解释该过程。
*
有点难以理解文本是什么,但是您要查找的内容是从浏览器发出的单独请求中返回的。希望所使用的参数对您有所帮助。
此请求 returns JSON 数据包含一个 d
条目,其中包含您要查找的 HTML。
下面显示了一个可能的 approach:how 来提取接近您要查找的数据的方法:
import requests
from bs4 import BeautifulSoup
post_json = {"tabNum":3,"type":"Muvaot","kod1":"","sug1":"","tnua":"","kod2":"","zurot":"","kod":"","erechzman":"","erechzura":"","arachim":"1484","erechzurazman":"","cMaxDist":"","aMaxDist":"","sql1expr":"","sql1sug":"","sql2expr":"","sql2sug":"","sql3expr":"","sql3sug":"","sql4expr":"","sql4sug":"","sql5expr":"","sql5sug":"","sql6expr":"","sql6sug":"","sederZeruf":"","distance":"","kotm":"הערך: <b>אֶלָּא</b>","mislifnay":"0","misacharay":"0","sOrder":"standart","pagenum":"1","lines":"0","takeMaxPage":"true","nMaxPage":-1,"year":"","hekKazar":False}
req = requests.post('https://maagarim.hebrew-academy.org.il/Pages/ws/Arachim.asmx/GetMuvaot', json=post_json)
d = req.json()['d']
soup = BeautifulSoup(d, "html.parser")
for num, table in enumerate(soup.find_all('table'), start=1):
print(f"Entry {num}")
tr_row_second = table.find('tr', class_='srRowSecond')
td = tr_row_second.find_all('td')[1]
print(" ", td.strong.text)
tr_row_third = table.find('tr', class_='srRowThird')
td = tr_row_third.find_all('td')[1]
print(" ", td.text)
这将为您提供起始信息:
Entry 1
תעודות בר כוכבא, ואדי מורבעאת 45
המסירה: Mur, 45
Entry 2
תעודות בר כוכבא, איגרת מיהונתן אל יוסה
מראה מקום: <שו' 4> | המסירה: Mur, 46
Entry 3
ברכת המזון
מראה מקום: רחם נא יי אלהינו על ישראל עמך, ברכה ג <שו' 6> (גרסה) | המסירה: New York, Jewish Theological Seminary (JTS), ENA, 2150, 47
Entry 4
ברכת המזון
מראה מקום: נחמנו יי אלהינו, ברכה ד, לשבת <שו' 6> | המסירה: Cambridge, University Library, T-S Collection, 8H 11, 4
我建议你 print(soup)
更好地理解返回的内容。
美汤加载的网页中没有您要的内容。当“网络浏览器”运行s 所述网页中存在 javascript 代码时,它会在单独的 HTTP 请求中获取。 Beautiful Soup不运行javascript.
您可以尝试使用浏览器开发人员工具中的“网络”选项卡找出哪些 HTTP 请求已响应所需数据。如果结果证明这是一个可预测的 HTTP 请求,那么您可以直接在 python 中重新创建该请求,然后使用漂亮的汤来挑选有用的部分。 @Martin Evans 的回答 (
或者,您可以使用实际涉及使用 python 远程控制 Web 浏览器的方法。它允许 Web 浏览器加载页面,然后您可以访问 Python 中的 DOM 以从呈现的页面中获取您想要的内容。 Scraping javascript-generated data using Python and scrape html generated by javascript with python 等其他答案可以为您指明方向。