使用 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 等其他答案可以为您指明方向。