Python 用漂亮的汤刮:为什么赢了';get_text方法是否返回此元素的文本?
最近,我一直在用python做一个项目,其中包括为一些代理删除一些网站。我遇到的问题是,当我试图搜索某个知名的代理站点时,Beautiful Soup并没有达到我期望的效果,因为我要求Beautiful Soup查找IP在代理列表中的位置。我将尝试对每个代理的IP进行scape,当我在适当的元素上使用Beauty Soup的Python 用漂亮的汤刮:为什么赢了';get_text方法是否返回此元素的文本?,python,html,web-scraping,html-parsing,beautifulsoup,Python,Html,Web Scraping,Html Parsing,Beautifulsoup,最近,我一直在用python做一个项目,其中包括为一些代理删除一些网站。我遇到的问题是,当我试图搜索某个知名的代理站点时,Beautiful Soup并没有达到我期望的效果,因为我要求Beautiful Soup查找IP在代理列表中的位置。我将尝试对每个代理的IP进行scape,当我在适当的元素上使用Beauty Soup的.get_text()方法时,我将得到如下输出 ... .UbZT{display:none} .f5fa{display:inline} .Glj2{display:no
.get_text()
方法时,我将得到如下输出
...
.UbZT{display:none}
.f5fa{display:inline}
.Glj2{display:none}
.cUce{display:inline}
.zjUZ{display:none}
.GzLS{display:inline}
98120169.117.186373161218218.83839393101138154165203242
...
下面是我试图解析的元素(包含IP的td标记):
.lLXJ{显示:无}
.qRCB{display:inline}
.qC69{显示:无}
.V0zO{display:inline}
190.220515656616161110110135135221234234.
2944228248.7444480858585100100130130168212230230230
该元素的实际文本只是代理的IP
下面是我的代码片段:
# Hide My Ass
pages = ['https://www.hidemyass.com/proxy-list']
for page in pages:
hidemyass = Soup(requests.get(page).text)
rows = hidemyass.find_all(lambda tag:tag.name=='tr' and tag.has_attr('class'))
for row in rows:
fields = row.find_all('td')
# get ip, port, and protocol for proxy
ip = fields[1].get_text() # <-- Here's the above td element
port = fields[2].get_text()
protocol = fields[6].get_text().lower()
# store proxy in database
db.add_proxy({'ip':ip,'port':port,'protocol':protocol})
num_found += 1
#把我的屁股藏起来
页码=['https://www.hidemyass.com/proxy-list']
对于页面中的页面:
hidemyas=Soup(requests.get(page.text)
rows=hidemyas.find_all(lambda标记:tag.name=='tr'和tag.has_attr('class'))
对于行中的行:
字段=行。查找所有('td'))
#获取代理的ip、端口和协议
ip=字段[1]。get#text()#BeautifulSoup
无法将可见文本与HTML标记中的其他文本区分开来。这个特殊的网站在模糊标记方面做得很好,使网页的抓取变得更复杂。您可以尝试理解哪些文本是可见的,但这并不容易,因为插入了许多不相关的元素,可以通过样式或类直接使其不可见。一些IP
部分位于span
s中,其中一些不是任何标记的一部分
一种解决方法是使用只能从元素中抓取可见文本的方法。例如,此代码将打印特定表中的所有IP
s:
from selenium.webdriver.firefox import webdriver
browser = webdriver.WebDriver()
browser.get('https://www.hidemyass.com/proxy-list')
rows = browser.find_elements_by_xpath('//table[@id="listtable"]//tr')
for row in rows[1:]:
cells = row.find_elements_by_tag_name('td')
print cells[1].text
browser.close()
另见:
希望能有所帮助。不久前,我用这段代码解析hidemyas.com代码(这是Perl,用正则表达式解析HTML是一种糟糕的方法):
sub find\u ip{
我的($html)=@;
我的$ip;
my($style_section)=$html=~m{(+?)};
我的(@bad_style)=$style_节=~m/
\.(\w+\s*\{显示:\s*无\}
/isxg;
我的$bad_styles=加入(“|”、@bad_styles);
$html=~s{}{}{}g;
$ip=$html;
返回$ip;
}
谢谢您提供的信息。我真的希望我不必使用selenium,因为它只需刮擦就相当笨重。+1:我查看了这个网站的Javascript,它真的很智能。它以特定的类、ID或其他属性为目标,并将它们剥离。我试图绕过JS,但开销太大了。硒确实是一种更好的方法。@Nanashi是的,谢谢。我很惊讶地看到混淆数据涉及到了多少。你不是每天都能看到这一点@Gold-请注意,您可以使用带有selenium的“无头”浏览器,请参见和。@alecxe:如果您是一个提供模糊IP跟踪服务的站点,那么我会更安全,因为您甚至会想到模糊您的站点!很聪明。我必须考虑一个这样的事件在未来当我刮一个网站。
from selenium.webdriver.firefox import webdriver
browser = webdriver.WebDriver()
browser.get('https://www.hidemyass.com/proxy-list')
rows = browser.find_elements_by_xpath('//table[@id="listtable"]//tr')
for row in rows[1:]:
cells = row.find_elements_by_tag_name('td')
print cells[1].text
browser.close()
sub find_ip {
my ($html) = @_;
my $ip;
my ($style_section) = $html =~ m{<style>(.+?)</style>};
my (@bad_styles) = $style_section =~ m/
\.(\w+)\s*\{display:\s*none\}
/isxg;
my $bad_styles = join("|", @bad_styles);
$html =~ s{<div .+? </div>}{}isxg;
$html =~ s{<span style="display:none">.+?</span>}{}g;
$html =~ s{<style>.+?</style>}{};
$html =~ s{^<span>|</span>$}{}g;
$html =~ s{<span class="(?:$bad_styles)">.+?</span>}{}g;
$html =~ s{</?[^>]+>}{}g;
$ip = $html;
return $ip;
}