【问题标题】:Python, BeautifulSoup finding HTML segmentPython,BeautifulSoup 查找 HTML 段
【发布时间】:2018-10-05 10:42:35
【问题描述】:

我是一个新手,只是想遵循automate the boring stuff webscraping example 中的 webscraping 示例。我正在尝试的是在一个 python 代码中自动从phdcomics 下载图像

  • 从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'的正确方法应该是什么? TIA

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

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

    <!-- Comic Table --!>
    

    什么时候应该,

    <!-- Comic Table -->
    

    这会导致 BeautifulSoup 丢失某些标签。有很多方法可以解析和删除 cmets,例如使用 regex、Comment,但在这种情况下可能很难让它们工作。最简单的方法是在收集 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
    

    【讨论】:

    • 非常感谢!这解决了问题,但现在的问题是我如何获得“phdcomics.com/comics/archive.php?comicid=2004”作为输出?因为如果我已经知道这一点,我就不会寻找那个。这是将根据页码更改的页面 ID,但我需要以某种方式将 phdcomics.com/comics/images/prev_button.gif 连接到输出,因为我相信这是上一页按钮的图像。再次,提前谢谢!
    • 更新了答案,希望对您有所帮助。
    猜你喜欢
    • 2013-09-18
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-04-21
    • 2021-12-27
    • 2022-01-20
    • 2018-07-09
    相关资源
    最近更新 更多