Python Beautifulsoup,在标签中获取href标签

时间:2020-08-17 10:34:06

标签: python html web-scraping beautifulsoup

我在获取href标签时遇到问题,所以我的情况是这样的, 这是html文件:

<div class="list-product with-sidebar">
 <a class="frame-item" href="./produk-a.html" target="_blank" title="Produk A">

 </a>
 <a class="frame-item" href="./produk-b.html" target="_blank" title="Produk B">

 </a>
</div>

所以这是我的代码

    def get_category_item_list(category):
        base_url = 'https://www.website.com/'
        res = session.get(base_url+category)
        res = BeautifulSoup(res.content, 'html.parser')
        all_title = res.findAll('a', attrs={'class':'frame-item'})
        data_titles = []
        for title in all_title:
            product_link = title.get('a')['href']
            data_titles.append(product_link)
        return data_titles 

我想得到的是href链接..像这样

produk-a.html
produk-b.html

当我尝试运行它时..它不会让我在href上获得链接,他们给出了错误代码:

TypeError: 'NoneType' object is not subscriptable

3 个答案:

答案 0 :(得分:1)

我相信您的问题出在这行:

product_link = title.get('a')['href']

您已经有一个“ a”元素列表,因此您可能只需要:

product_link = title['href']

答案 1 :(得分:1)

您没有与我们共享网站,所以一个问题可能是该网站阻止了看起来像机器人的用户代理(请求的用户代理)。调试可能会有所帮助,您可以使用resp.content/text打印页面的内容。

我创建了一个名为index.html的HTML文件,然后读取该文件并将其内容抓取。我更改了一些代码,看起来一切正常。

soup.find返回一个<class 'bs4.element.Tag'>,因此您可以使用attribute['a']访问它的属性。

from bs4 import BeautifulSoup

with open('index.html') as f:
    html_content = f.read()

soup = BeautifulSoup(html_content, 'html.parser')
data_titles = []
for a in soup.find('div', class_='list-product with-sidebar').find_all('a'):
    data_titles.append(a['href'].split('/')[1])
print(data_titles)
# ['produk-a.html', 'produk-b.html']

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <div class="list-product with-sidebar">
            <a
                class="frame-item"
                href="./produk-a.html"
                target="_blank"
                title="Produk A"
            >
            </a>
            <a
                class="frame-item"
                href="./produk-b.html"
                target="_blank"
                title="Produk B"
            >
            </a>
        </div>
    </body>
</html>

答案 2 :(得分:1)

对于您的确切输出,

  1. 您已经遍历了定位标记
  2. 您需要用“ /”分隔并选择最后一个元素
from bs4 import BeautifulSoup


html = """<div class="list-product with-sidebar">
 <a class="frame-item" href="./produk-a.html" target="_blank" title="Produk A">

 </a>
 <a class="frame-item" href="./produk-b.html" target="_blank" title="Produk B">

 </a>
</div>"""

res = BeautifulSoup(html, 'html.parser')

for a in res.findAll('a', attrs={'class':'frame-item'}):
    print(a["href"].split("/")[-1])

输出:

produk-a.html
produk-b.html