无法使用beauthulsoup从span元素收集属性

2024-09-29 21:41:24 发布

您现在位置:Python中文网/ 问答频道 /正文

This是我想使用BeautifulSoup从以下站点(https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Examination)解析的源代码的图像。我希望提取<;span class='print-only'>;属性中的属性:htm链接。在

我的python代码如下所示:

import urllib.request                                                                                                                                              

try:                                                                                                                                                
    from BeautifulSoup import BeautifulSoup                                                                                                                          
except ImportError:                                                                                                                                                    
    from bs4 import BeautifulSoup  

url = "https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Examination"
with urllib.request.urlopen(url) as page:
     html_source = page.read()
soup = BeautifulSoup(html_source, 'html5lib')
link = soup.findAll("span", {"class":"print-only"})

打印“link”将返回空列表。我知道html代码中有span元素,因为芬德尔汤(“span”)返回html代码(尽管在这些span元素的内容中没有看到名为“print only”的类)。在

我注意到span属性在Firefox开发者窗口中变灰了。快速的google搜索显示,这意味着该属性是隐藏的。这是否意味着用我现在使用的方法不能得到它?


Tags: 代码httpsimportonlysearch属性htmlgov
3条回答

下面是一个使用BeautifulSoup获取所需内容的解决方案,首先让我们获取表:

table = soup.find("table",{'id':'GridView1'})

现在我们在它的主体中找到了tr标记:

^{pr2}$

注意你要找的标签不在那里。我展示了列表的第一项,以便您更好地分析您需要的url在哪里,正如我们所看到的,它是我们想要的第一个a标记,因此例如:

>>> table.find('tbody').findAll('tr')[0].find('a')
<a href="/Nchs/Nhanes/2009-2010/ARX_F.htm">ARX_F Doc</a>

现在剩下要做的就是编写一个列表理解,将列表中每个tr标记中第一个a标记的所有href属性连接起来:

>>> trList = table.find('tbody').findAll('tr')
>>> lst = [tr.find('a')['href'] for tr in trList]

如果我们打印lst的第一个元素,我们会看到这是我们想要的输出:

>>> lst[:3]
['/Nchs/Nhanes/2009-2010/ARX_F.htm', '/Nchs/Nhanes/1999-2000/AUX1.htm', '/Nchs/Nhanes/2001-2002/AUX_B.htm']

由于span元素是隐藏的,您将无法使用BeautifulSoup检索它。也许,您可以使用其他属性来获取所需的链接。如果您知道要为其提取链接的.htm文件的名称,则只需使用内部文本找到“a”元素(它还绑定了所需的链接和隐藏的span元素),然后从元素中提取“href”,如下所示:

import requests
from bs4 import BeautifulSoup
import html5lib
import string

ascii = set(string.printable)
def remove_non_ascii(s):
    return filter(lambda x: x in ascii, s)


url = 'https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Examination'
home_url = 'https://wwwn.cdc.gov'

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
page = requests.get(url, headers = headers, allow_redirects = True)
soup = BeautifulSoup(remove_non_ascii(page.text), "html5lib")

link = soup.find_all('a', text='ARX_F Doc')[0]
complete_url = home_url + link.get('href')
print complete_url

试试这个:

import urllib.request                                                                                                                                              
from bs4 import BeautifulSoup                                                                                                                             
url = "https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Examination"
with urllib.request.urlopen(url) as page:
     html_source = page.read()
soup = BeautifulSoup(html_source, 'html5lib')

link = soup.find_all("span", class_="print-only")

相关问题 更多 >

    热门问题