使用BeautifulSoup从html源文件解析特定信息并将其保存为.csv文件

时间:2013-07-04 19:25:01

标签: python parsing csv html-parsing lxml

我要做的是从HTML源文件中提取/解析订单信息,并将其保存在.csv文件中。

我需要的html源代码是:  1.订单号(例如:99),  2.名字(例如:Peter Haans)和  3.订单金额(例如:€41,94)。

因为我是Python的新手(以及一般的编程),我很难正确地解析信息并保存它。

目前我正在使用此代码:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_doc)

orderField = soup.tbody.tr.next_sibling.next_sibling
orderNumber = soup.tbody.tr.next_sibling.next_sibling.contents[3]
customerName = soup.tbody.tr.next_sibling.next_sibling.contents[5]
totalAmount = soup.tbody.tr.next_sibling.next_sibling.contents[9]

print orderField
print orderNumber
print customerName
print totalAmount

您可以查看完整的HTML代码here(Dropbox链接)。

这是我正在使用的HTML代码的一部分:

<tbody>
<tr class="filter">
<td></td>
<td align="right"><input type="text" name="filter_order_id" value="" size="4" style="text-align: right;"></td>
<td><input type="text" name="filter_customer" value="" class="ui-autocomplete-input" autocomplete="off" role="textbox" aria-autocomplete="list" aria-haspopup="true"></td>
<td><select name="filter_order_status_id">
<option value="*"></option>
<option value="0">Afgebroken bestellingen</option>
<option value="23">Bestelling geannuleerd</option>
<option value="17">Bestelling ontvangen</option>
<option value="24">Bestelling verzonden</option>
<option value="22">Betaling mislukt</option>
<option value="20">Betaling ontvangen via Bank</option>
<option value="19">Betaling ontvangen via PayPal</option>
<option value="21">Betaling via Bank mislukt</option>
<option value="18">Betaling via PayPal mislukt</option>
<option value="25">Gereed voor afhalen (Delft)</option>
<option value="26">Wachten op betaling</option>
</select></td>
<td align="right"><input type="text" name="filter_total" value="" size="4" style="text-align: right;"></td>
<td><input type="text" name="filter_date_added" value="" size="12" class="date hasDatepicker" id="dp1372950239097"></td>
<td><input type="text" name="filter_date_modified" value="" size="12" class="date hasDatepicker" id="dp1372950239098"></td>
<td align="right"><a onclick="filter();" class="button">Filter</a></td>
</tr>
<tr>
<td style="text-align: center;"> <input type="checkbox" name="selected[]" value="99">
</td>
<td class="right">99</td>
<td class="left">Peter Haans</td>
<td class="left">Betaling ontvangen via Bank</td>
<td class="right">€ 41,94</td>
<td class="left">03-07-2013</td>
<td class="left">03-07-2013</td>
<td class="right"> [ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/info&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=99">Bekijk</a> ]
[ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/update&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=99">Wijzigen</a> ]
</td>
</tr>
<tr>
<td style="text-align: center;"> <input type="checkbox" name="selected[]" value="98">
</td>
<td class="right">98</td>
<td class="left">Peter Haans</td>
<td class="left">Bestelling geannuleerd</td>
<td class="right">€ 41,94</td>
<td class="left">03-07-2013</td>
<td class="left">03-07-2013</td>
<td class="right"> [ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/info&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=98">Bekijk</a> ]
[ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/update&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=98">Wijzigen</a> ]
</td>
</tr>
<tr>
<td style="text-align: center;"> <input type="checkbox" name="selected[]" value="96">
</td>
<td class="right">96</td>
<td class="left">Akam Rezakhani</td>
<td class="left">Bestelling verzonden</td>
<td class="right">€ 41,94</td>
<td class="left">01-07-2013</td>
<td class="left">02-07-2013</td>
<td class="right"> [ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/info&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=96">Bekijk</a> ]
[ <a href="http://www.fonexshop.nl/admin/index.php?route=sale/order/update&amp;token=470a3c2fa62a4cc029825bd6010520bb&amp;order_id=96">Wijzigen</a> ]
</td>
</tr>

有关如何使其正常工作的任何想法?

感谢。

修改

通过修改生成html页面的模板,有人提供了一个非常好的答案来帮助我解决它。

他建议添加其他类名,例如orderId,customerName和orderAmount。

但由于某种原因,他删除了他的答案。我要感谢他,因为它让我更近了一步。

我得到所有订单ID,客户名称和订单金额的三个原始列表(带有html代码)。

这是代码:

from bs4 import BeautifulSoup
import lxml

html_doc = open('bestellingen.html', 'r')
soup = BeautifulSoup(html_doc,'lxml')

orderId = soup.select('.orderId')
customerName = soup.select('.customerName')
orderAmount = soup.select('.orderAmount')

print orderId
print customerName
print orderAmount

有没有办法过滤原始html所以它只显示我需要的信息?

1 个答案:

答案 0 :(得分:0)

通过修改生成html页面的模板,有人提供了一个非常好的答案来帮助我解决它。

他建议添加其他类名,例如orderId,customerName和orderAmount。

我要感谢他,因为它让我更近了一步。

我得到所有订单ID,客户名称和订单金额的三个原始列表(带有html代码)。

这是代码:

from bs4 import BeautifulSoup
import lxml

html_doc = open('bestellingen.html', 'r')
soup = BeautifulSoup(html_doc,'lxml')

orderId = soup.select('.orderId')
customerName = soup.select('.customerName')
orderAmount = soup.select('.orderAmount')

print orderId
print customerName
print orderAmount

有没有办法过滤原始html所以它只显示我需要的信息?