使用循环从HTML代码获取数据

2024-04-26 09:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从一个简单的网站上抓取数据,并使用带有selenium的python2.7将其保存到CSV文件中,但我遇到了一个小问题。你知道吗

正如您在下面的HTML中看到的,有两个类companyperson。在company类下,有时有3个person类,有时只有1或4个person类,因此这意味着没有序列。你知道吗

每次只能得到指定公司类下的persons时,我应该怎么做?你知道吗

<tr class="company">..</tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="company">..</tr>
<tr class="person">..</tr>
<tr class="company">..</tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="company">..</tr>

数据应保存在csv中,如下所示:

company1       person1
company1       person2 
company1       person3 

company2       person1 

company3       person1 
company3       person2 

有人帮我吗?我应该在这里使用哪种循环?什么是逻辑?你知道吗


Tags: 文件csv数据网站htmlseleniumtrcompany
2条回答

我知道你正试图用硒来达到这个目的。但更有效的方法是使用requestsbeautifulsouplibs。它们同时适用于2.7和3.x版本的Python。你知道吗

问题的简单示例:

好的,html看起来像这样:

<tr class="company"></tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="company"></tr>
<tr class="person">..</tr>
<tr class="company"></tr>
<tr class="person">..</tr>
<tr class="person">..</tr>
<tr class="company">..</tr>

我以前的代码:

import requests
from bs4 import BeautifulSoup

response = requests.get(yourUrl)
soup = BeautifulSoup(response.text, 'html.parser')

companyPersons = {}
for company in soup.find_all('tr',{'class': 'company'}): # find all class'es with company
    for person in company.children: # finds all children tags, e.g. company has 2 childrens person1 and person2, so it will find both
        if company in companyPersons:
            companyPersons[company].append(person)
        else:
            companyPersons[company] = person

编辑到上一个答案 我已经检查了html和什么是需要得到的。这个方法和我之前写的很相似,只是有一些小的改动。你知道吗

test_dict = {}
for company in soup.find_all('tr', {'class': 'regroworg'}):
    for child in company.find_all('span', {'class': 'regorgname'}):
        for person in company.find_next_siblings('tr', {'class': 'regrow'} != {'class': 'regroworg'}):
            if person['class'] != company['class']:
                if child.text not in test_dict:
                    test_dict[child.text] = [person.text]
                else:
                    test_dict[child.text].append(person.text)
            else:
                break

上面的代码和你写的一样有效。它应该抓住公司所有的人。代码{'class': 'regrow'} != {'class': 'regroworg'}中的这一部分为寻找所需的兄弟姐妹发挥了所有的魔力。 结果类似于:

test_dict['ABB Secheron Ltd.']
['\nMr. Emmanuel Mittay, Key Account Manager\nemmanuel.mittay@ch.abb.com\n41 58 586 25 09\n41 58 586 22 28']

现在您可以将数据写入.CSV或其他任何地方。你知道吗

解决当前问题的代码的一些问题

当然,我认为从性能的角度来看,它可以做得更好,但对于当前的问题,它应该是好的。我注意到大约有607个公司的(但我不是100%确定这个数字),但是我的代码提取了396个字典键(例如,公司的)。所以我建议调试代码并修复它。但是我认为这个代码至少解决了你50%的问题,现在只要自己修复它,100%地解决它(我认为解决它很容易)。;)

要仅获取class='company'的tr标记内的人员,必须使用仅选择该Webelements的定位器,例如:

persons = driver.find_elements_by_xpath('//tr[@class="company"]')
for person in persons:
    print (person.text)

这是一个例子,如何打印的人,与一些更多的努力,你可以把他们保存在一个csv文件。你知道吗

相关问题 更多 >