Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 美化组迭代不工作_Python_Parsing_Beautifulsoup - Fatal编程技术网

Python 美化组迭代不工作

Python 美化组迭代不工作,python,parsing,beautifulsoup,Python,Parsing,Beautifulsoup,您好,我正在尝试解析此网站()的html并获取表数据。我试图从结果中排除前三个表行,但由于某些原因,我无法让解析器这样做。这是我第一次尝试专业刮削,我完全不知道如何让它工作。我猜这可能与我正在使用的html5lib解析器有关,但老实说,我不知道。谁能告诉我怎么才能让它工作 作为一个好的测试,从前三行提取数据是非常有用的。这样我可以确信完成的查询将从除这些之外的任何地方提取数据 例如,表中的第一行是“马术网站”您只取前三行,不忽略列表中的前三个元素: from bs4 import Beautif

您好,我正在尝试解析此网站()的html并获取表数据。我试图从结果中排除前三个表行,但由于某些原因,我无法让解析器这样做。这是我第一次尝试专业刮削,我完全不知道如何让它工作。我猜这可能与我正在使用的html5lib解析器有关,但老实说,我不知道。谁能告诉我怎么才能让它工作

作为一个好的测试,从前三行提取数据是非常有用的。这样我可以确信完成的查询将从除这些之外的任何地方提取数据


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

您只取前三行,不忽略列表中的前三个元素:

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”)
不用担心,如果我知道你只是想要更多的链接,生活会更简单!我添加了代码,让他们添加你考虑的前三行。