python - 美汤刮痧 : Why won't the get_text method return the text of this element?

标签 python html web-scraping html-parsing beautifulsoup

最近我一直在用 python 开发一个项目,该项目涉及为一些代理抓取一些网站。我遇到的问题是,当我尝试抓取某个知名代理站点时,当我要求 Beautiful Soup 查找 IP 在代理表中的位置时,Beautiful Soup 并没有按照我的预期进行。我会尝试为每个代理寻找 IP,当我在适当的元素上使用 Beautiful 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 标记):

<td><span><style>
.lLXJ{display:none}
.qRCB{display:inline}
.qC69{display:none}
.V0zO{display:inline}
</style><span style="display: inline">190</span><span class="V0zO">.</span><span 
style="display:none">2</span><div style="display:none">20</div><span 
style="display:none">51</span><span style="display:none">56</span><div 
style="display:none">56</div><span style="display:none">61</span><span 
class="lLXJ">61</span><div style="display:none">61</div><span 
class="qC69">110</span><div 
style="display:none">110</div><span style="display:none">135</span><div 
style="display:none">135</div><span class="V0zO">221</span><span 
style="display:none">234</span><div style="display:none">234</div><span class="147">.
</span><span style="display: inline">29</span><div style="display:none">44</div><span 
style="display:none">228</span><span></span><span class="qC69">248</span>.<span 
style="display:none">7</span><span></span><span style="display:none">44</span><span 
class="qC69">44</span><span class="qC69">80</span><span></span><span 
style="display:none">85</span><span class="lLXJ">85</span><div 
style="display:none">85</div><span class="qC69">100</span><div 
style="display:none">100</div><span></span><span class="qC69">130</span><div 
style="display:none">130</div><div style="display:none">168</div>212<span 
style="display:none">230</span><span class="qC69">230</span><div 
style="display:none">230</div></span></td>  

此元素的实际文本只是代理的 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

有没有一种正确的方法来解析这个元素,这样输出就不会像这样乱七八糟了? Beautiful Soup 的 .get_text() 方法会准确返回网站上可见的文本,这似乎很直观,但我认为这不是真的。感谢您提供任何帮助或建议。

最佳答案

BeautifulSoup 无法将可见文本与 HTML 标记中的其他文本区分开来。这个特定的网站在混淆标记方面做得非常好,并使页面的网络抓取更加复杂。您可以尝试了解哪些文本是可见的,但这并不容易,因为插入了很多不相关的元素,可以通过 style 或通过 class 直接使其不可见.一些 IP 部分在 span 中,其中一些不属于任何标签。

一种解决方法是使用 Selenium它只能从元素中获取 visible 文本。例如,此代码将打印特定表中的所有 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()

另见:

希望对您有所帮助。

关于python - 美汤刮痧 : Why won't the get_text method return the text of this element?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23431088/

相关文章:

html - 如何在 Foundation 中构建嵌套的照片网格?

ruby - 如何阻止网站中的 Watir ruby​​ gem 事件?

python - 使用 selenium 和 python 在 Chromedriver 中保存扩展设置

javascript - js - 使用 js 按钮更改 html 属性

javascript - 带坐标的响应式图像映射

python - 如何在python中将字符串列表转换为字典

python - csv 模块将时间写入十进制

python - 具有浮点值的 WxSlider?

python - 对 Tensorflow 中保存/恢复经过训练的权重和偏差感到困惑

python - scipy.sparse 矩阵的逐点运算