Python 用漂亮的汤刮:为什么赢了';get_text方法是否返回此元素的文本?

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

最近,我一直在用python做一个项目,其中包括为一些代理删除一些网站。我遇到的问题是,当我试图搜索某个知名的代理站点时,Beautiful Soup并没有达到我期望的效果,因为我要求Beautiful Soup查找IP在代理列表中的位置。我将尝试对每个代理的IP进行scape,当我在适当的元素上使用Beauty Soup的
.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;
}