【问题标题】:Why are some html tags invisible when scraping?为什么抓取时有些html标签不可见?
【发布时间】:2020-02-19 23:27:21
【问题描述】:

我正在尝试从 here 中抓取文本以直接输入到 Excel 工作表中,而不是复制和粘贴。该网站使用 Html 来包含有关原始字体的信息。这是如何在页面上对一行文本进行编码的示例:

<div class="line">
    <span class="milestone_wrap"> </span>
    <a id="tln-2212" href="index.html#tln-2212" class="milestone tln invisible" title="TLN: 2212">2212</a>
    <span class="milestone_wrap">When </span>
    <span class="typeform" data-setting="ſ">s</span>
    <span class="milestone_wrap">uch ill dealing mu</span>
    <span class="ligature" data-precomposed="ſt">
        <span class="typeform" data-setting="ſ">s</span>
        <span class="milestone_wrap">t</span>
    </span>
    <span class="milestone_wrap"> be </span>
    <span class="typeform" data-setting="ſ">s</span>
    <span class="milestone_wrap">eene in thought. </span>
    <span class="sd exit">
        <span class="space" style="padding-right:1em;" xml:space="preserve"></span>
        <i>Exit</i>
        <span class="milestone_wrap">.</span>
    </span>
</div>

我尝试过使用 find_all 方法

import requests
from bs4 import BeautifulSoup as bs
url = 'https://internetshakespeare.uvic.ca/doc/R3_F1/scene/3.6/index.html'
page = requests.get(url)
text = bs(page.text, 'html.parser')

divs = text.find_all('div', class_="line")
for div in divs:
    for item in div.contents: print(item)

这是我回来的:

When 
<span class="typeform" data-setting="ſ">s</span>
uch ill dealing mu
<span class="ligature" data-precomposed="ſt"><span class="typeform" data-setting="ſ">s</span>t</span>
 be 
<span class="typeform" data-setting="ſ">s</span>
eene in thought. 
<span class="sd exit"><span class="space" style="padding-right:1em;" xml:space="preserve"> </span><i>Exit</i>.</span>

带有标签&lt;span class="milestone_wrap"&gt; 的所有内容都没有标签:因此,当我使用 .find_all 表示“span”时,这些字符串不会出现,所以我只剩下随机字母。该课程没有出现是有原因的吗?

【问题讨论】:

    标签: python html web-scraping beautifulsoup tags


    【解决方案1】:

    line类级别工作,但分解a标签,从而去除行号;除非你真的想要它们,在这种情况下,我会在它们和以下文本之间添加空格:

    import requests
    from bs4 import BeautifulSoup as bs
    
    r = requests.get('https://internetshakespeare.uvic.ca/doc/R3_F1/scene/3.6/index.html')
    soup = bs(r.content, 'lxml')
    
    for line in soup.select('.line'):
        line.select_one('a').decompose()
        print(line.text)
    

    【讨论】:

      【解决方案2】:

      在执行代码时稍作调整(必须导入 requests 模块),您应该会获得网站的内容。

      from bs4 import BeautifulSoup as bs
      import requests
      
      url = 'https://internetshakespeare.uvic.ca/doc/R3_F1/scene/3.6/index.html'
      page = requests.get(url)
      text = bs(page.text, 'html.parser')
      
      divs = text.find_all('div', class_="line")
      for div in divs:
          for item in div.contents: print(item)
      

      文本可以在&lt;span class="milestone_wrap"&gt; 标签中找到。您可以使用浏览器的 inspector 进行检查。文本按标签分小部分交付,例如“其中一个”。您应该能够提取文本。

      【讨论】:

      • 我忘了粘贴第一行代码,但我确实导入了请求 - 该类的标签仍然没有显示
      猜你喜欢
      • 2018-07-30
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2016-11-03
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多