我是python(2.7)的新手,我有以下html代码(存储在我的硬盘上的文本文件中),我想从中提取某些数据:
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Art @ Home BV">Art @ Home BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Groothandel in overige consumentenartikelen n.e.g.">Groothandel in overige consumentenartikelen n...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Arkeneel 2 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3905 NS
<label class="downdrill-sbi" title="VEENENDAAL">VEENENDAAL</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>0318-514063</td><td>VAT nr.</td><td>30069687</td></tr>
<tr><td>F.</td><td>0318-529434</td><td colspan="2"></td></tr>
<tr>
<td colspan="2"> <a href="http://" target="_blank"></a> </td>
<td>Businesskey</td>
<td>S1585464</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S1585464" value="S1585464">
<label for="bedrijf_geselecteerd-2-S1585464">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S1585464" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S1585464" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Art Collection International BV">Art Collection International BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Groothandel in overige consumentenartikelen n.e.g.">Groothandel in overige consumentenartikelen n...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Hollandse Kade 32 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">1391 JM
<label class="downdrill-sbi" title="ABCOUDE">ABCOUDE</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>0294-286666</td><td>VAT nr.</td><td>30196193</td></tr>
<tr><td>F.</td><td>0294-286600</td><td>BKL nr.</td><td>45213546904B01</td></tr>
<tr>
<td colspan="2"> <a href="http://www.artcollectioninternational.nl" target="_blank">www.artcollectioninternational.nl</a> </td>
<td>Businesskey</td>
<td>S3046655</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S3046655" value="S3046655">
<label for="bedrijf_geselecteerd-2-S3046655">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S3046655" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S3046655" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Art Fashion BV">Art Fashion BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Groothandel in overige consumentenartikelen n.e.g.">Groothandel in overige consumentenartikelen n...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Prattenburg 35 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3452 NN
<label class="downdrill-sbi" title="VLEUTEN">VLEUTEN</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>0345-588020</td><td>VAT nr.</td><td>11058753</td></tr>
<tr><td>F.</td><td>0183-564113</td><td>BKL nr.</td><td>45213249429B01</td></tr>
<tr>
<td colspan="2"> <a href="http://" target="_blank"></a> </td>
<td>Businesskey</td>
<td>S2482421</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S2482421" value="S2482421">
<label for="bedrijf_geselecteerd-2-S2482421">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S2482421" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S2482421" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Arthe Civil & Structure BV">Arthe Civil & Structure BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Technisch ontwerp en advies voor grond-, water- en wegenbouw">Technisch ontwerp en advies voor grond-, wate...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Kokermolen 7 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3994 DG
<label class="downdrill-sbi" title="HOUTEN">HOUTEN</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>030-6384554</td><td>VAT nr.</td><td>30236509</td></tr>
<tr><td colspan="2"></td><td>BKL nr.</td><td>45219013602B01</td></tr>
<tr>
<td colspan="2"> <a href="http://www.arthecs.nl" target="_blank">www.arthecs.nl</a> </td>
<td>Businesskey</td>
<td>S4354827</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S4354827" value="S4354827">
<label for="bedrijf_geselecteerd-2-S4354827">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S4354827" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S4354827" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Arthemis KDV BV">Arthemis KDV BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Kinderopvang">Kinderopvang</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Springweg 102 /E</td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3511 VV
<label class="downdrill-sbi" title="UTRECHT">UTRECHT</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>06-51520630</td><td>VAT nr.</td><td>50087932</td></tr>
<tr><td colspan="2"></td><td>BKL nr.</td><td>45222551135B01</td></tr>
<tr>
<td colspan="2"> <a href="http://" target="_blank"></a> </td>
<td>Businesskey</td>
<td>S4957725</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S4957725" value="S4957725">
<label for="bedrijf_geselecteerd-2-S4957725">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S4957725" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S4957725" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Arthur & Willemijn Stores BV">Arthur & Willemijn Stores BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Winkels in bovenkleding en mode-artikelen (algemeen assortiment)">Winkels in bovenkleding en mode-artikelen (al...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Steenhoffstraat 11 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3764 BH
<label class="downdrill-sbi" title="SOEST">SOEST</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>033-4229111</td><td>VAT nr.</td><td>31022283</td></tr>
<tr><td>F.</td><td>033-4621539</td><td>BKL nr.</td><td>45207729541B01</td></tr>
<tr>
<td colspan="2"> <a href="http://www.arthurenwillemijnstores.nl" target="_blank">www.arthurenwillemijnstores.nl</a> </td>
<td>Businesskey</td>
<td>S3666945</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S3666945" value="S3666945">
<label for="bedrijf_geselecteerd-2-S3666945">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S3666945" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S3666945" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Artifoto Veenendaal VOF">Artifoto Veenendaal VOF</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Winkels in fotografische artikelen">Winkels in fotografische artikelen</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Hoofdstraat 84 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3901 AV
<label class="downdrill-sbi" title="VEENENDAAL">VEENENDAAL</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>0318-511607</td><td>VAT nr.</td><td>58133488</td></tr>
<tr><td colspan="2"></td><td colspan="2"></td></tr>
<tr>
<td colspan="2"> <a href="http://www.artifoto.nl" target="_blank">www.artifoto.nl</a> </td>
<td>Businesskey</td>
<td>S5786857</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S5786857" value="S5786857">
<label for="bedrijf_geselecteerd-2-S5786857">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S5786857" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S5786857" href="#">Meer info</a>
</span>
</div>
</div><div class="tab_content_card">
<div class="card-header">
<strong title="Artitec BV">Artitec BV</strong>
<span class="tel" title="Telefoonnummer aanwezig en geen mailstop en geen indicator “afgesloten of onjuist”.">Telefoonnummer aanwezig</span><span class="marketable besluit" title="Hier vindt besluitvorming plaats en bedrijf heeft geen mailstop en is marketable">Marketable / Hier vindt besluitvorming plaats</span><span class="mailstop geen-mailstop" title="Bedrijf heeft geen mailstop en adresgegevens zijn bekend en geen buitenlands adres">Geen Mailstop</span>
</div>
<div class="card-content">
<table>
<tbody>
<tr>
<td colspan="4">
<label class="downdrill-sbi" title="Groothandel in ferrometalen en -halffabrikaten">Groothandel in ferrometalen en -halffabrikate...</label>
</td>
</tr>
<tr>
<td width="20"> </td>
<td width="245"> </td>
<td width="50"> </td>
<td width="80"> </td>
</tr>
<tr>
<td colspan="2">Fornheselaan 120 </td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="2">3734 GE
<label class="downdrill-sbi" title="DEN DOLDER">DEN DOLDER</label>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr><td>T.</td><td>030-8507060</td><td>VAT nr.</td><td>33217980</td></tr>
<tr><td>F.</td><td>030-8507061</td><td>BKL nr.</td><td>NL007793972B01</td></tr>
<tr>
<td colspan="2"> <a href="http://www.artitec.com" target="_blank">www.artitec.com</a> </td>
<td>Businesskey</td>
<td>S2185596</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<span class="card-checked">
<input type="checkbox" id="bedrijf_geselecteerd-2-S2185596" value="S2185596">
<label for="bedrijf_geselecteerd-2-S2185596">Geselecteerd</label>
</span>
<label class="mailstop-card-text">Dit bedrijf heeft een mailstop</label>
<a class="card-plaatsinwinkelwagen" rel="S2185596" href="#">Plaats in winkelwagen</a>
<span>|</span>
<span>
<a class="card-meerinfo" rel="S2185596" href="#">Meer info</a>
</span>
</div>
在网页上看起来如何:
使用以下脚本我试图提取两家公司的电话号码(P.
):
import xml.etree.ElementTree as ET
tree = ET.parse('html88.txt')
root = tree.getroot()
for variable in root.findall('tbody'):
phone = variable.find('/html/body/div[1]/div[2]/table/tbody/tr[6]/td[2]').text
print(phone)
结果:
Traceback (most recent call last):
File "C:/Users/Jacob/PycharmProjects/untitled/yay4.py", line 3, in <module>
tree = ET.parse('html88.txt')
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1182, in parse
tree.parse(source, parser)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 656, in parse
parser.feed(data)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1653, in feed
self._raiseerror(v)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1517, in _raiseerror
raise err
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 9
我做错了什么,如何解决这个问题?
答案 0 :(得分:1)
我会使用Beautiful Soup(pip install beautifulsoup4)。它似乎正确处理数据。而且,不是依赖于永不改变的顺序,看起来你可以枚举所有td标签,寻找一个等于'P'的标签。然后是电话号码。这是代码。它适用于您包含的HTML代码。
from bs4 import BeautifulSoup
with open('html88.txt', 'r') as f:
html_string = f.read()
soup = BeautifulSoup(html_string, 'html.parser')
td_list = soup.find_all('td')
for index, variable in enumerate(td_list):
# Look for phone numbers
if variable.text == 'P.':
# The next one should be a phone number, but make sure there are more tags to parse
if index < len(td_list):
# There are more tags, so the next one should be the phone number
phone = td_list[index + 1].text
print(phone)