【问题标题】:Cannot chain find and find_all in BeautifulSoup无法在 BeautifulSoup 中链接 find 和 find_all
【发布时间】:2018-01-03 23:49:03
【问题描述】:

我有一本关于 BeautifulSoup 的书和文档。两人都说我应该能够链接 find/find_all 方法并使用下标从单页抓取中准确获取我想要的内容。情况似乎并非如此。请考虑下表。

<tr>
<td><span style="display:none;" class="sortkey">Dresser !</span><span class="sorttext">**<a href="/wiki/Louise_Dresser" title="Louise Dresser">Louise Dresser</a>**</span></td>
<td><span style="display:none;" class="sortkey">Ship !</span><span class="sorttext"><i><a href="/wiki/A_Ship_Comes_In" title="A Ship Comes In">A Ship Comes In</a></i></span></td>
<td><span style="display:none;" class="sortkey">Pleznik !</span><span class="sorttext">Mrs. Pleznik</span></td>
</tr>
<tr>
<td><span style="display:none;" class="sortkey">Swanson !</span><span class="sorttext"><a href="/wiki/Gloria_Swanson" title="Gloria Swanson">Gloria Swanson</a></span></td>
<td><i><a href="/wiki/Sadie_Thompson" title="Sadie Thompson">Sadie Thompson</a></i></td>
<td><span style="display:none;" class="sortkey">Thompson !</span><span class="sorttext">Sadie Thompson</span></td>
</tr>
<tr>
<th scope="row" rowspan="6" style="text-align:center"><a href="/wiki/1928_in_film" title="1928 in film">1928</a>/<a href="/wiki/1929_in_film" title="1929 in film">29</a><br />
<small><a href="/wiki/2nd_Academy_Awards" title="2nd Academy Awards">(2nd)</a></small></th>
<td style="background:#FAEB86"><b><span style="display:none;" class="sortkey">Pickford !</span><span class="sorttext">**<a href="/wiki/Mary_Pickford" title="Mary Pickford">Mary Pickford</a>**</span> <img alt="Award winner" src="//upload.wikimedia.org/wikipedia/commons/f/f9/Double-dagger-14-plain.png" width="9" height="14" data-file-width="9" data-file-height="14" /></b></td>

对于每个表格行,我需要抓取第一个元素,然后是第一个嵌套标签内的文本。 Lousie Dresser 将是第一个数据点,其次是 Gloria Swanson,然后是 Mary Pickford。

我认为以下内容可以让我到达那里,但我错了,6 小时后我就被浪费了。

def getActresses(URL):
    try:
        html = urlopen(URL)
    except HTTPError:
        print("Page not found.")
        return None
    try:
        bsObj = BeautifulSoup(html, "lxml")
        soup = bsObj.find("table", {"class":"wikitable sortable"})
    except AttributeError:
        print("Error creating/navigating soup object")
    data = soup.find_all("tr").find_all("td").find("a").get_text()
    print(data)


getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress")

这不是我尝试过的唯一代码。我尝试遍历行,然后是表格数据单元格,然后访问标签。我试过要求一个标签,然后将它们正则表达式出来,只是被告知我不能得到我想要的文本。我在尝试链接操作(如上)时遇到的最常见错误是AttributeError: 'ResultSet' object has no attribute 'find'. 下标绝对不起作用,即使在复制书籍示例时也是如此(去图?!)。此外,我有进程自己中止,我不知道这是可能的。

对于正在发生的事情以及为什么应该如此简单的事情似乎是这样一个事件的想法将不胜感激。

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:
    import requests
    from bs4 import BeautifulSoup
    
    def getActresses(URL):
        res = requests.get(URL)
    
        try:
            soup = BeautifulSoup(res.content, "lxml")
            table = soup.find("table", {"class":"wikitable sortable"})
        except AttributeError:
            print("Error creating/navigating soup object")
    
        tr = table.find_all("tr")
    
        for _tr in tr:
            td = _tr.find_all("td")
            for _td in td:
                a = _td.find_all("a")
                for _a in a:
                    print(_a.text.encode("utf-8"))
    
    getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress")
    

    使用text 而不是get_text(),抱歉我使用requests 模块来演示

    find_all 方法总是返回一个列表,所以你必须循环遍历它

    【讨论】:

    • 绝对正确,无需道歉。我不能代表所有人,但我的经验是,大多数人都很友好。你的回复让我很接近。输出是一个名称列表(这很好),但它们的顺序错误,并且包含在答案集中不受欢迎的名称,所以我的下一个任务是将其整理出来,但即使达到这一点也会有没有你的帮助是不可能的。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 2019-12-20
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多