Python,BeautifulSoup 寻找 HTML 片段

标签 python html web-scraping beautifulsoup

我是一个新手,只是想了解 automate the boring stuff 中的网络抓取示例网络抓取示例。我正在尝试的是自动从 phdcomics 下载图像在一个 python 代码中将

  • 从HTML中找到图片的链接并下载

  • 从 HTML 中找到上一页的链接并转到那里重复步骤 1 直到第一页。

对于下载当前页面图像,打印soup.prettify() 之后的HTML 代码段如下所示-

<meta content="Link to Piled Higher and Deeper" name="description">
 <meta content="PHD Comic: Remind me" name="title">
  <link 
href="http://www.phdcomics.com/comics/archive/phd041218s.gif" rel="image_src">
   <div class="jumbotron" style="background-color:#52697d;padding: 0em 0em 0em;  margin-top:0px; margin-bottom: 0px; background-image: url('http://phdcomics.com/images/bkg_bottom_stuff3.png'); background-repeat: repeat-x;">
    <div align="center" class="container-fluid" style="max-width: 1800px;padding-left: 0px; padding-right:0px;">

然后当我写的时候

newurl=soup.find('link', {'rel': "image_src"}).get('href')

它给了我我需要的,也就是

"http://www.phdcomics.com/comics/archive/phd041218s.gif "

在下一步中,当我想找到上一页链接时,我认为它在 HTML 代码的以下部分中 -

<!-- Comic Table --!>
        <table border="0" cellspacing="0" cellpadding="0">
          <tr> 
            <td align="right" valign="top">
            <a href=http://phdcomics.com/comics/archive.php?comicid=2004><img height=52 width=49 src=http://phdcomics.com/comics/images/prev_button.gif border=0 align=middle><br></a><font 
                face=Arial,Helvetica,Geneva,Swiss,SunSans-Regular size=-1><i><b>previous </b></i></font><br><br><a href=http://phdcomics.com/comics/archive.php?comicid=1995><img src=http://phdcomics.com/comics/images/jump_bck10.gif border=0></a><br><a href=http://phdcomics.com/comics/archive.php?comicid=2000><img src=http://phdcomics.com/comics/images/jump_bck5.gif border=0></a><br><font face=Arial,Helvetica,Geneva,Swiss,SunSans-Regular size=-1><i><b>jump</b></i></font><br><br><a href=http://phdcomics.com/comics/archive.php?comicid=1><img src=http://phdcomics.com/comics/images/first_button.gif border=0 align=middle><br></a><font face=Arial,Helvetica,Geneva,Swiss,SunSans-Regular size=-1><i><b>first</b></i></font><br><br>               </td>
            <td align="center" valign="top"><font color="black"> 

从这部分代码我要找

=http://phdcomics.com/comics/archive.php?comicid=2004

作为我之前的链接。 当我尝试这样的事情时 -

Prevlink=soup.find('a',{'src': 'http://phdcomics.com/comics/images/prev_button.gif'}).get('href')
print(Prevlink)

它给我这样的错误-

Prevlink=soup.find('a',{'src': 'http://phdcomics.com/comics/images/prev_button.gif'}).get('href')
AttributeError: 'NoneType' object has no attribute 'get'

即使我尝试这样做-

Prevlink=soup.find('a',{'href': 'http://phdcomics.com/comics/archive.php?comicid=2004'}).get('href')
print(Prevlink)

我得到类似的错误-

Prevlink=soup.find('a',{'href': 'http://phdcomics.com/comics/archive.php?comicid=2004'}).get('href')
AttributeError: 'NoneType' object has no attribute 'get'

获得正确的'href' 的正确方法应该是什么? 时间差

最佳答案

问题在于在 Phd comics 的 html 上添加注释的方式。 . 如果你仔细观察 soup.prettify() 的输出,你会发现这样的注释

<!-- Comic Table --!>

应该的时候,

<!-- Comic Table -->

这会导致 BeautifulSoup 遗漏某些标签。有很多方法可以解析和删除评论,比如使用正则表达式、评论,但在这种情况下可能很难让它们起作用。最简单的方法是在收集 html 后修复评论标签。

from bs4 import BeautifulSoup
import requests
url = "https://phdcomics.com/"
r  = requests.get(url)
data = r.text
data = data.replace("--!>","-->") # fix comments
soup = BeautifulSoup(data)
Prevlink=soup.find('a',{'href': 'http://phdcomics.com/comics/archive.php?comicid=2004'}).get('href')
print Prevlink
http://phdcomics.com/comics/archive.php?comicid=2004

更新: 要自动找到请求的链接,我们需要找到“http://phdcomics.com/comics/images/prev_button.gif”的父元素并提取链接

img_tag = soup.find('img',{'src':'http://phdcomics.com/comics/images/prev_button.gif'})
print img_tag.find_parent().get('href')
http://phdcomics.com/comics/archive.php?comicid=2005

关于Python,BeautifulSoup 寻找 HTML 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50014068/

相关文章:

html - 在 CSS3/HTML5 中使用自定义字体?

html - 使用 CSS 使父 div 独立于父 div

html - 从 HTML 中提取商品价格

python - Beautifulsoup 获取汤中未选择的元素

python - python 中 time.sleep 的奇怪打印行为

python - 查找其中一个字段大于另一字段的查询集

javascript - jQuery 向字符串中添加不需要的字符?

web-scraping - 我如何在 Julia 中进行网页抓取?

javascript - Python:解析类似 JSON 的 Javascript 数据结构(带连续逗号)

python - 用颜色打印cmd