【问题标题】:Using BeautifulSoup to extract the title of a link使用 BeautifulSoup 提取链接的标题
【发布时间】:2015-12-09 03:23:28
【问题描述】:

我正在尝试使用 BeautifulSoup 提取链接的标题。我正在使用的代码如下:

url = "http://www.example.com"
source_code = requests.get(url)
plain_text = source_code.text
soup = BeautifulSoup(plain_text, "lxml")
for link in soup.findAll('a', {'class': 'a-link-normal s-access-detail-page  a-text-normal'}):
    title = link.get('title')
    print title

现在,link 元素示例包含以下内容:

<a class="a-link-normal s-access-detail-page a-text-normal" href="http://www.amazon.in/Introduction-Computation-Programming-Using-Python/dp/8120348664" title="Introduction To Computation And Programming Using Python"><h2 class="a-size-medium a-color-null s-inline s-access-title a-text-normal">Introduction To Computation And Programming Using <strong>Python</strong></h2></a>

但是,运行上述代码后,什么都没有显示。如何提取存储在link 中存储的锚标记的title 属性中的值?

【问题讨论】:

    标签: python python-2.7 web-scraping beautifulsoup python-requests


    【解决方案1】:

    好吧,您似乎在s-access-detail-pagea-text-normal 之间放置了两个空格,这反过来又找不到任何匹配的链接。尝试使用正确数量的空格,然后打印找到的链接数量。此外,您可以打印标签本身 - print link

    import requests
    from bs4 import BeautifulSoup
    
    url = "http://www.amazon.in/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=python"
    source_code = requests.get(url)
    plain_text = source_code.content
    soup = BeautifulSoup(plain_text, "lxml")
    links = soup.findAll('a', {'class': 'a-link-normal s-access-detail-page a-text-normal'})
    print len(links)
    for link in links:
        title = link.get('title')
        print title
    

    【讨论】:

    • print link 输出我在原始帖子中提到的上述link 值。类名确实是正确的,并且能够找到匹配的链接。但我似乎无法从link 中提取title 属性中的值。
    • 请尝试将.text 替换为.content,即plain_text = source_code.content。另外,你能发布一个示例网址吗?
    • 这是我正在使用的 URL:http://www.amazon.in/s/ref=nb_sb_noss?url=search-alias%3Daps&amp;field-keywords=python
    • 页面的html源中没有class的链接。
    • 尝试检查包含书名的元素。
    【解决方案2】:

    您正在这里搜索一个精确的字符串,通过使用多个类。在这种情况下,类字符串必须与完全匹配,并带有单个空格。

    请参阅文档中的Searching by CSS class section

    您也可以搜索类属性的确切字符串值:

    css_soup.find_all("p", class_="body strikeout")
    # [<p class="body strikeout"></p>]
    

    但是搜索字符串值的变体是行不通的:

    css_soup.find_all("p", class_="strikeout body")
    # []
    

    你会更好地搜索个别课程:

    soup.find_all('a', class_='a-link-normal')
    

    如果您必须匹配多个类,请使用CSS selector

    soup.select('a.a-link-normal.s-access-detail-page.a-text-normal')
    

    您列出类的顺序无关紧要。

    演示:

    >>> from bs4 import BeautifulSoup
    >>> plain_text = u'<a class="a-link-normal s-access-detail-page a-text-normal" href="http://www.amazon.in/Introduction-Computation-Programming-Using-Python/dp/8120348664" title="Introduction To Computation And Programming Using Python"><h2 class="a-size-medium a-color-null s-inline s-access-title a-text-normal">Introduction To Computation And Programming Using <strong>Python</strong></h2></a>'
    >>> soup = BeautifulSoup(plain_text)
    >>> for link in soup.find_all('a', class_='a-link-normal'):
    ...     print link.text
    ... 
    Introduction To Computation And Programming Using Python
    >>> for link in soup.select('a.a-link-normal.s-access-detail-page.a-text-normal'):
    ...     print link.text
    ... 
    Introduction To Computation And Programming Using Python
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 2020-01-23
      • 2021-01-05
      • 2019-12-30
      • 1970-01-01
      • 2016-06-27
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多