Python 美化组迭代不工作
您好,我正在尝试解析此网站()的html并获取表数据。我试图从结果中排除前三个表行,但由于某些原因,我无法让解析器这样做。这是我第一次尝试专业刮削,我完全不知道如何让它工作。我猜这可能与我正在使用的html5lib解析器有关,但老实说,我不知道。谁能告诉我怎么才能让它工作 作为一个好的测试,从前三行提取数据是非常有用的。这样我可以确信完成的查询将从除这些之外的任何地方提取数据Python 美化组迭代不工作,python,parsing,beautifulsoup,Python,Parsing,Beautifulsoup,您好,我正在尝试解析此网站()的html并获取表数据。我试图从结果中排除前三个表行,但由于某些原因,我无法让解析器这样做。这是我第一次尝试专业刮削,我完全不知道如何让它工作。我猜这可能与我正在使用的html5lib解析器有关,但老实说,我不知道。谁能告诉我怎么才能让它工作 作为一个好的测试,从前三行提取数据是非常有用的。这样我可以确信完成的查询将从除这些之外的任何地方提取数据 例如,表中的第一行是“马术网站”您只取前三行,不忽略列表中的前三个元素: from bs4 import Beautif
例如,表中的第一行是“马术网站”您只取前三行,不忽略列表中的前三个元素:
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
应该是DataGrid.find_all('tr')[3:
#除前三个元素外的所有元素
DataGrid.find_all('tr')[:3] # first three elements
上面的tbl.find_all(“tr”)
在切片时使用两个不同的解析器输出:
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
如果您真的想要更多的HREF,那么您应该完全这样做,为每个tr
获取a
标记,在您真正想要的行之前还有6个tr,因此您需要跳过6:
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
输出:
tbl = soup.find("table")
out = (tag.find('a') for tag in tbl.find_all("tr")[6:])
for a in out:
print(a["href"])
for a in out:
print("http://www.virginiaequestrian.com/{}".format(a["href"]))
要使用链接,只需在主url前面加上前缀:
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
..................
输出:
tbl = soup.find("table")
out = (tag.find('a') for tag in tbl.find_all("tr")[6:])
for a in out:
print(a["href"])
for a in out:
print("http://www.virginiaequestrian.com/{}".format(a["href"]))
如果你打开第一个,你将进入马术网站,即你想要的第一个数据 是的,我这么做是因为表中有很多元素,我想测试这个片段是否正常工作。我改变了一些数字,但我不认为有任何影响。我总是能得到完整的列表……它对我很有用,试着更改你的解析器,你确定要打印DataGrid.find_all('tr')[:3]
和DataGrid.find_all('tr')
给你完全相同的输出吗?如果我使用默认或'lxml',我会得到一个非类型错误。这就是为什么我必须使用html5lib。我打印了DataGrid=soup.find('tbody')test=[]用于DataGrid中的tr.find_all('tr'):用于tr.find_all('td'):打印td.text test.append(td)print'\n%I'%len(test)并包括[:3]我得到了一个3601的计数。如果不包括切片器,我得到的计数是5399…这实际上现在提出了一个问题,为什么在364个元素的表中,前3个元素构成了计数的一半以上…完全按照上面的方法运行代码,并添加tbl的长度。find_all(“tr”)[3://code>和tbl。find_all(“tr”)
不用担心,如果我知道你只是想要更多的链接,生活会更简单!我添加了代码,让他们添加你考虑的前三行。