2016-07-30 23 views
0

这是我使用遍历所有元素的代码:美丽的汤未选择任何元件

soup_top = bs4.BeautifulSoup(r_top.text, 'html.parser') 

selector = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 

for link in soup_top.select(selector): 
    print(link) 

在JavaScript中使用时,相同的选择给出的57的长度:

document.querySelectorAll("#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a").length; 

我认为,也许我没有正确地获取网页的内容。然后我保存了网页的本地副本,但Beautiful Soup中的选择器仍然没有选择任何内容。这里发生了什么?

这是website我使用的是代码。

+0

你能分享HTML吗?没有它,这将是很难看到发生了什么事情。 –

+0

正如已经提到的,我们不知道没有看到html –

+0

@Kristof我已经添加了一个链接到网站,我试图刮。 –

回答

0

看来这是由于您使用的parser(即html.parser)。如果我尝试同样的事情lxml为解析器:

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.swapnilpatni.com/law_charts_final.php' 
r = requests.get(url) 
r.raise_for_status() 

soup = BeautifulSoup(r.text, 'lxml') 

css_select = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 
links = soup.select(css_select) 
print('{} link(s) found'.format(len(links))) 

>> 1 link(s) found 

for link in links: 
    print(link['href']) 

>> spadmin/doc/Company Law amendment 1.1.png 

html.parser会返回一个结果,直到#ContentPlaceHolder1_gvDisplay table tr,而且当时它只返回第一个tr

当运行通过W3 Markup Validation Service的URL,这是返回的错误:

对不起,我无法验证此文件,因为上线1212它包含了,我不能解释为UTF一个或多个字节-8(换句话说,找到的字节在指定的字符编码中不是有效值)。请检查文件内容和字符编码指示。 错误是:UTF8“\ XA0”不映射到Unicode

这很可能是html.parser扼流圈这个为好,而lxml更容错。

+0

谢谢kristof :) 通常使用'lxml'而不是'html.parser'更好吗? –

+0

就像你在文档中的比较表中看到的一样,'lxml'很快(因为它用C语言编写)并且非常宽松。就我个人而言,我总是使用'lxml',但缺点是它会在您的项目中引入额外的外部依赖性。 –

+0

我得到错误'无法找到您请求的功能的树生成器:lxml'。我想这是你的意思是外部依赖。我如何解决它? –