最近我一直在用 python 开发一个项目,其中涉及抓取一些网站的一些代理。我遇到的问题是,当我尝试抓取某个知名代理站点时,当我要求 Beautiful Soup 查找 IP 在代理表中的位置时,它并没有按照我的预期执行操作。我将尝试查找每个代理的 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
是否有正确的方法来解析此元素,以便输出不会像这样混乱?看起来很直观,美丽的汤.get_text()
方法将准确返回网站上可见的文本,但我认为这不是真的。感谢您的任何帮助或建议。
BeautifulSoup
无法区分 HTML 标记中的可见文本和其他文本。这个特定的网站在混淆标记方面做得非常好,并使页面的网络抓取变得更加复杂。您可以尝试了解哪些文本是可见的,但这并不容易,因为插入了很多不相关的元素,可以通过以下方式直接使其不可见style
或通过class
。一些IP
零件在span
s,其中一些不属于任何标签。
一种解决方法是使用Selenium http://selenium-python.readthedocs.org/只能抓取visible
来自元素的文本。例如,此代码将打印所有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()
也可以看看:
- BeautifulSoup 抓取可见网页文本 https://stackoverflow.com/questions/1936466/beautifulsoup-grab-visible-webpage-text
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)