BeautifulSoup迭代不工作

2024-06-28 20:43:06 发布

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

from bs4 import BeautifulSoup
import requests
s=requests.Session()
r=s.get('http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8')
soup=BeautifulSoup(r.text,'html5lib')

DataGrid=soup.find('tbody')
test=[]
for tr in DataGrid.find_all('tr')[:3]:
        for td in tr.find_all('td'):
            print td.string

嗨,我正在尝试解析这个网站(http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8)的html并获取表数据。我试图从结果中排除前三个表行,但由于某些原因,我无法让解析器执行此操作。这是我的第一次专业刮尝试,我完全不知道如何让这个工作。我猜这可能与我使用的html5lib解析器有关,但老实说,我不知道。有人能告诉我怎么才能让它工作吗?你知道吗

作为一个好的测试,从前三项中提取数据是非常有用的行。这个我有信心完成的查询将从这些以外的任何东西中提取。你知道吗

例如,表中的第一行是“马术网站”


Tags: importcomhttpmainwwwactionfindrequests
1条回答
网友
1楼 · 发布于 2024-06-28 20:43:06

只取前三个不忽略[:3],它从列表中分割前三个元素:

 DataGrid.find_all('tr')[:3] # first three elements

应该是DataGrid.find_all('tr')[3:]#除前三个元素外的所有元素

from bs4 import BeautifulSoup
import requests

r=requests.get('http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8')
soup=BeautifulSoup(r.content)

tbl = soup.find("table")
for tag in tbl.find_all("tr")[3:]:
    for td in tag.find_all('td'):
        print td.text

当切片并使用两个不同的解析器输出时,上述tbl.find_all("tr")

In [20]: soup=BeautifulSoup(r.content,"html.parser")

In [21]: tbl = soup.find("table")

In [22]: len(tbl.find_all("tr"))
Out[22]: 364

In [23]: len(tbl.find_all("tr")[3:])
Out[23]: 361

In [24]: soup=BeautifulSoup(r.content,"lxml")

In [25]: tbl = soup.find("table")

In [26]: len(tbl.find_all("tr")[3:])
Out[26]: 361

In [27]: len(tbl.find_all("tr"))
Out[27]: 364

如果你真的想要more的hrefs,那么你就应该这样做,为每个a获取tr标记,在你真正想要的行之前还有6个tr,所以你需要跳过6:

tbl = soup.find("table")
out = (tag.find('a') for tag in tbl.find_all("tr")[6:])

for a in out:
    print(a["href"])

输出:

main.cfm?action=greenpages&sub=view&ID=9068
main.cfm?action=greenpages&sub=view&ID=9504
main.cfm?action=greenpages&sub=view&ID=10868
main.cfm?action=greenpages&sub=view&ID=10261
main.cfm?action=greenpages&sub=view&ID=10477
main.cfm?action=greenpages&sub=view&ID=10708
main.cfm?action=greenpages&sub=view&ID=11712
main.cfm?action=greenpages&sub=view&ID=12402
main.cfm?action=greenpages&sub=view&ID=12496
..................

要使用链接,只需在主url前面加上:

for a in out:
    print("http://www.virginiaequestrian.com/{}".format(a["href"]))

输出:

http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=9068
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=9504
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10868
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10261
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10477
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10708
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=11712
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12402
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12496
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12633
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=13528

如果你打开第一个网站,你就会看到马术网站,也就是你想要的第一个数据。你知道吗

相关问题 更多 >